7

Spring、Spring Security、BlazeDS、Flex、および spring-flex を使用しています。

認証のためにSpring Securityを呼び出してフックchannelSet.login()できることを知っています。を呼び出すまで、常にfalseとして開始されるため、現在の Flex セッションについてのみ知っているようです。channelSet.logout()channelSet.authenticatedchannelSet.login()

私がしたいこと:

  1. Flex から確認して、ユーザーが既にセッションに参加しているかどうかを確認します。
  2. もしそうなら、私は彼らのユーザー名と役割が欲しい.

更新brd6644
の回答 から使用したソリューションの詳細を以下に追加すると思いました。このStackOverflow の回答を使用して、注入可能にしました。この回答のコードを書き直すつもりはないので、.SecurityContextSecurityContextFacade

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>
4

3 に答える 3

3

Spring Blazed 統合を使用する場合、org.springframework.flex.security.AuthenticationResultUtils を使用して getUserDetails メソッドを実装できます。

public Map<String, Object> getUserDetails() {  
 return AuthenticationResultUtils.getAuthenticationResult();
}
于 2009-10-28T06:03:20.127 に答える
2

現在のユーザーのロール情報を返すセキュアな Spring サービス メソッドを作成します。アプリケーションの起動時に、Flex アプリがそれを呼び出せるようにします。セキュリティ エラーが原因で FaultEvent を受け取った場合は、ユーザーに認証を求め、ChannelSet.login() を使用するように求めます。

于 2009-07-23T04:45:00.043 に答える
0

このブログを参照してください。Spring がこの問題をうまく解決するフレックス モジュールを持つ前に、私はこれに従いました。うまくいけば、役立つかもしれないいくつかの宝石を提供します。

GridShore ブログ

于 2009-07-24T14:23:12.680 に答える