2009-07-22 12 views
7

Estoy usando Spring, Spring Security, BlazeDS, Flex y spring-flex.¿Cómo puedo verificar Spring Security para la autenticación del usuario y obtener roles de Flex?

Sé que puedo llamar a channelSet.login() y channelSet.logout() para conectarme a Spring Security para la autenticación. channelSet.authenticated aparentemente solo conoce la sesión Flex actual, ya que siempre comienza como falso, hasta que llame al channelSet.login().

lo que quiero hacer:

  1. Comprobar la de Flex para saber si un usuario ya está en una sesión.
  2. Si es así, quiero su nombre de usuario y funciones.

ACTUALIZACIÓN
simplemente pensé que me gustaría añadir detalles de la solución utilicé de respuesta brd6644 's abajo, por lo que esto podría ser más fácil para alguien que mira esto. Utilicé la respuesta StackOverflow this para hacer el inyectable SecurityContext. No voy a volver a escribir el código de esa respuesta en este, así que ve a buscar el 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> 

Respuesta

3

Si utiliza Spring Blazeds integration, se puede implementar utilizando el método getUserDetails org.springframework.flex.security.AuthenticationResultUtils.

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

Esto fue MUCHO mejor que lo que estaba pasando.Funcionó muy bien y guardó un montón de código. –

2

que iba a escribir un método de servicio de Primavera asegurado que devuelve información de los roles del usuario actual. Deje que la aplicación Flex lo invoque cuando la aplicación se inicie. Si recibe un FaultEvent debido a un error de seguridad, solicite al usuario que se autentique y use ChannelSet.login().

+0

Esto funcionó muy bien. Gracias. –

+0

Buena idea, definitivamente intentaré esto. – JamesC

0

Ver este blog, seguí esto antes de que Spring tuviera un módulo flexible, lo que resuelve este problema muy bien. Con suerte, le proporcionará algunas gemas que podrían ayudar.

GridShore Blog

+0

Las personas que comentan en sus publicaciones de blog parecen tener los mismos problemas que yo; principalmente, el inicio y cierre de sesión fue fácil desde Flex, pero notar que una sesión existente no lo era. La solución de brd6644 funcionó perfectamente para esto. –

Cuestiones relacionadas