2009-07-22 8 views
7

Uso Spring, Spring Security, BlazeDS, Flex e Spring-flex.Come posso verificare Spring Security per l'autenticazione dell'utente e ottenere ruoli da Flex?

So che posso chiamare channelSet.login() e channelSet.logout() per connettersi a Spring Security per l'autenticazione. channelSet.authenticated a quanto pare conosce solo la sessione Flex attuale, poiché inizia sempre come false, fino a quando non si chiama channelSet.login().

quello che voglio fare:

  1. Controllare da Flex per sapere se un utente è già in una sessione.
  2. Se è così, voglio il loro nome utente e ruoli.

UPDATE
Ho solo pensato che vorrei aggiungere dettagli della soluzione che ho usato dalla risposta brd6644 s' al di sotto, in modo che questo potrebbe essere più facile per qualcun altro che guarda questo. Ho usato la risposta StackOverflow this per rendere l'iniettabile SecurityContext. Non sto riscrivendo il codice da quella risposta in questo, quindi dai un'occhiata allo 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> 

risposta

3

Se si utilizza Spring Blazeds integration, è possibile implementare il metodo getUserDetails utilizzando org.springframework.flex.security.AuthenticationResultUtils.

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

Questo era MOLTO meglio di quello che stavo succedendo.Ha funzionato molto bene e ha salvato un sacco di codice. –

2

avrei scritto un metodo di servizio Primavera assicurato che restituisce le informazioni ruoli dell'utente corrente. Lascia che l'app Flex invochi quello all'avvio dell'applicazione. Se si riceve un errore FaultEvent a causa di un errore di sicurezza, richiedere all'utente di autenticarsi e utilizzare ChannelSet.login().

+0

Questo ha funzionato molto bene. Grazie. –

+0

Bella idea, lo proverò. – JamesC

0

Vedere questo blog, l'ho seguito prima che Spring disponesse di un modulo flessibile, che risolva bene questo problema. Spero che ti fornisca alcune gemme che potrebbero aiutarti.

GridShore Blog

+0

Le persone che commentano i suoi post sul blog sembrano avere gli stessi problemi di me; principalmente il fatto che l'accesso e l'uscita fossero facili da parte di Flex, ma notarlo non era una sessione esistente. La soluzione di brd6644 ha funzionato perfettamente per questo. –

Problemi correlati