Ich verwende Feder, Federsicherheit, BlazeDS, Flex und Feder-Flex.Wie kann ich Spring Security auf Benutzerauthentifizierung überprüfen und Rollen von Flex abrufen?
Ich weiß, dass ich channelSet.login()
und channelSet.logout()
anrufen kann, um in Spring Security zur Authentifizierung einzubinden. channelSet.authenticated
anscheinend nur über die aktuelle Flex-Sitzung, wie es immer beginnt als false, bis Sie channelSet.login()
anrufen.
Was ich tun möchte:
- Prüfen von Flex wissen, ob ein Benutzer bereits in einer Sitzung ist.
- Wenn ja, ich möchte ihren Benutzernamen und Rollen.
UPDATE
ich, dass ich von brd6644 ‚s Antwort unten verwenden nur dachte ich Details der Lösung hinzufügen würde, so dass diese für jemanden einfacher sein könnten sonst die diese nach oben schauen. Ich verwendete this StackOverflow Antwort, um die SecurityContext
injizierbaren machen. Ich werde nicht den Code von dieser Antwort in diesem neu schreiben, also gehen Sie es für die SecurityContextFacade
betrachten.
securityServiceImpl.java
public class SecurityServiceImpl implements SecurityService {
private SecurityContextFacade securityContextFacade;
@Secured({"ROLE_PEON"})
public Map<String, Object> getUserDetails() {
Map<String,Object> userSessionDetails = new HashMap<String, Object>();
SecurityContext context = securityContextFacade.getContext();
Authentication auth = context.getAuthentication();
UserDetails userDetails = (UserDetails) auth.getPrincipal();
ArrayList roles = new ArrayList();
GrantedAuthority[] grantedRoles = userDetails.getAuthorities();
for (int i = 0; i < grantedRoles.length; i++) {
roles.add(grantedRoles[i].getAuthority());
}
userSessionDetails.put("username", userDetails.getUsername());
userSessionDetails.put("roles", roles);
return userSessionDetails;
}
}
securityContext.xml
<security:http auto-config="true">
<!-- Don't authenticate Flex app -->
<security:intercept-url pattern="/flexAppDir/**" access="IS_AUTHENTICATED_ANONYMOUSLY" />
<!-- Don't authenticate remote calls -->
<security:intercept-url pattern="/messagebroker/amfsecure" access="IS_AUTHENTICATED_ANONYMOUSLY" />
</security:http>
<security:global-method-security secured-annotations="enabled" />
<bean id="securityService" class="ext.domain.project.service.SecurityServiceImpl">
<property name="securityContextFacade" ref="securityContextFacade" />
</bean>
<bean id="securityContextFacade" class="ext.domain.spring.security.SecurityContextHolderFacade" />
flexContext.xml
<flex:message-broker>
<flex:secured />
</flex:message-broker>
<flex:remoting-destination ref="securityService" />
<security:http auto-config="true" session-fixation-protection="none"/>
FlexSecurityTest.mxml
<mx:Application ... creationComplete="init()">
<mx:Script><![CDATA[
[Bindable]
private var userDetails:UserDetails; // custom VO to hold user details
private function init():void {
security.getUserDetails();
}
private function showFault(e:FaultEvent):void {
if (e.fault.faultCode == "Client.Authorization") {
Alert.show("You need to log in.");
// show the login form
} else {
// submit a ticket
}
}
private function showResult(e:ResultEvent):void {
userDetails = new UserDetails();
userDetails.username = e.result.username;
userDetails.roles = e.result.roles;
// show user the application
}
]]></mx:Script>
<mx:RemoteObject id="security" destination="securityService">
<mx:method name="getUserDetails" fault="showFault(event)" result="showResult(event)" />
</mx:RemoteObject>
...
</mx:Application>
Das war viel besser als das, was ich vorhatte.Es hat sehr gut funktioniert und viel Code gespart. –