2009-07-22 2 views
7

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:

  1. Prüfen von Flex wissen, ob ein Benutzer bereits in einer Sitzung ist.
  2. 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> 

Antwort

3

Wenn Sie Spring Blazeds integration verwenden, können Sie getUserDetails Methode org.springframework.flex.security.AuthenticationResultUtils implementieren.

public Map<String, Object> getUserDetails() { 
return AuthenticationResultUtils.getAuthenticationResult(); 
} 
+0

Das war viel besser als das, was ich vorhatte.Es hat sehr gut funktioniert und viel Code gespart. –

2

ich eine gesicherte Feder Service-Methode, die des aktuellen Benutzers Rollen Informationen zurück zu schreiben. Lassen Sie die Flex-App beim Start der Anwendung darauf zugreifen. Wenn Sie aufgrund eines Sicherheitsfehlers ein FaultEvent erhalten, fordern Sie den Benutzer auf, sich zu authentifizieren und ChannelSet.login() zu verwenden.

+0

Dies funktionierte sehr gut. Vielen Dank. –

+0

Schöne Idee, werde def versuchen dies. – JamesC

0

Siehe diesen Blog, ich folgte diesem vor Spring hatte ein Flex-Modul, das dieses Problem gut löst. Hoffentlich gibt es Ihnen ein paar Edelsteine, die Ihnen helfen könnten.

GridShore Blog

+0

Die Leute, die seine Blogposts kommentieren, scheinen dieselben Probleme zu haben wie ich; Hauptsächlich war das An- und Abmelden von Flex einfach, aber eine bestehende Sitzung nicht zu bemerken. Die Lösung von brd6644 hat dafür perfekt funktioniert. –

Verwandte Themen