Wie kann ich überprüfen, Spring Security für die Authentifizierung der Benutzer und bekommen die Rollen von Flex?
Ich bin mit Spring, Spring Security, BlazeDS, Flex-und Feder-flex.
Ich weiß, dass ich anrufen kann channelSet.login()
und channelSet.logout()
hook Spring Security für die Authentifizierung. channelSet.authenticated
anscheinend kennt nur die aktuelle Flex-Sitzung, wie es immer beginnt als false, bis Sie rufen channelSet.login()
.
Was ich tun will:
- Check von Flex zu wissen, ob ein Benutzer bereits in einer session.
- Wenn dem so ist, möchte ich den Benutzernamen und Rollen.
UPDATE
Ich dachte, ich würde hinzufügen, details der Lösung, die ich verwendet, aus brd6644's Antwort unten, so dass dies möglicherweise einfacher für jemand anderes, der sieht dieses. Ich verwendet diese StackOverflow-Antwort, um die SecurityContext
injizierbare. Ich werde nicht umschreiben Sie den code aus, dass die Antwort in diesem einen, also gehen Sie es betrachten, für die SecurityContextFacade
.
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>
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn Sie Spring Blazeds integration , die Sie umsetzen können getUserDetails Methode mit org.springframework.flex.Sicherheit.AuthenticationResultUtils.
Ich würde schreiben einen gesicherten Feder-service-Methode gibt die aktuelle Benutzer-Rollen-Informationen. Lassen Sie das Flex-app aufrufen, wenn die Anwendung gestartet wird. Wenn Sie erhalten ein FaultEvent wegen Sicherheit Fehler, dann wird der Benutzer aufgefordert sich zu authentifizieren, und verwenden Sie ChannelSet.login().
Finden Sie in diesem blog, ich folgte diesem, bevor im Frühjahr hatte ein flex-Modul, das löst dieses problem schön. Hoffentlich werden Sie ein paar Edelsteine, die helfen könnte.
GridShore Blog