2009-07-22 61 views
7

我使用Spring,Spring Security,BlazeDS,Flex和spring-flex。如何检查Spring Security进行用户认证并从Flex获取角色?

我知道我可以拨打channelSet.login()channelSet.logout()挂钩到Spring Security进行身份验证。 channelSet.authenticated显然只知道当前的Flex会话,因为它总是以false开头,直到您致电channelSet.login()

我想做什么:从Flex的

  1. 检查知道,如果用户已经在一个会话。
  2. 如果是这样,我想要他们的用户名和角色。

UPDATE
我只是想我要补充我从下面brd6644的回答中使用的解决方案的细节,所以,这可能是为别人谁看起来这件事更容易。我用this StackOverflow答案使SecurityContext注射。我不会重写这个答案中的代码,所以去看看它的SecurityContextFacade

securityServiceImpl.java

​​


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> 

回答

3

如果使用Spring Blazeds integration,则可以使用org.springframework.flex.security.AuthenticationResultUtils实现getUserDetails方法。

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

这比我所做的要好得多。它工作得很好,并保存了很多代码。 – 2010-07-14 21:05:49

2

我会写一个返回当前用户的角色信息的安全春天服务方法。当应用程序启动时让Flex应用程序调用它。如果由于安全错误而收到FaultEvent,请提示用户进行身份验证并使用ChannelSet.login()。

+0

这工作得很好。谢谢。 – 2009-07-24 16:10:29

+0

不错的主意,会def试试这个。 – JamesC 2009-07-28 11:37:23

0

看到这个博客,我在Spring之前就有了一个flex模块,它很好地解决了这个问题。希望它能为您提供一些可能有用的宝石。

GridShore Blog

+0

评论他的博客帖子的人似乎遇到了和我一样的问题;主要是Flex可以轻松登录和注销,但是注意到现有会话不是。 brd6644的解决方案对此非常合适。 – 2009-07-24 16:11:32

相关问题