2009-07-22 32 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

相關問題