2009-07-22 7 views
7

私はSpring、Spring Security、BlazeDS、Flex、およびSpring-Flexを使用しています。ユーザ認証のためにSpring Securityをチェックし、Flexからロールを取得するにはどうすればよいですか?

私はchannelSet.login()ととchannelSet.logout()を呼び出して、認証のためにSpring Securityにフックできることを知っています。 channelSet.authenticatedは、channelSet.login()に電話するまで、常にの間違いとして始まるので、明らかに現在のFlexセッションについてのみ知っています。私が何をしたいか

:ユーザーがセッション中にすでにあるかどうかを知るためにFlexから

  1. チェック。
  2. もしそうなら、ユーザー名と役割が必要です。

私はちょうどこれがこれをルックアップし、他の誰かのために簡単になるように、私は、私は以下のbrd6644の答えから、使用する溶液の詳細を追加しようと思いました
UPDATE。私はSecurityContext注射可能にするにはthis StackOverflow答えを使用しました。私はこの回答のコードを書き直すことはしませんので、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

これは私がやっていたことよりもずっと良かったです。それは非常にうまくいって、多くのコードを保存しました。 –

2

私は、現在のユーザーのロール情報を返すセキュアな春のサービスメソッドを記述します。 Flexアプリケーションは、アプリケーションの起動時に起動させます。セキュリティエラーのためにFaultEventを受け取った場合、ChannelSet.login()を認証して使用するようにユーザーに求めます。

+0

これは非常にうまくいった。ありがとうございました。 –

+0

良いアイデア、これを試してみましょう。 – JamesC

0

このブログを見ると、Springにフレックスモジュールがある前にこの問題をうまく解決しています。うまくいけば、それはあなたを助けるかもしれないいくつかの宝石を提供するでしょう。

GridShore Blog

+0

ブログの投稿にコメントしている人は私と同じ問題を抱えているようです。主にFlexのログインとログアウトは簡単でしたが、既存のセッションに気付くのは簡単ではありませんでした。 brd6644のソリューションはこれに完全に対応しました。 –

関連する問題