如何检查 Spring Security 的用户身份验证并从 Flex 获取角色?

Posted

技术标签:

【中文标题】如何检查 Spring Security 的用户身份验证并从 Flex 获取角色?【英文标题】:How can I check Spring Security for user authentication and get roles from Flex? 【发布时间】:2010-11-13 04:33:29 【问题描述】:

我正在使用 Spring、Spring Security、BlazeDS、Flex 和 spring-flex。

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

我想做什么:

    检查 Flex 以了解用户是否已在会话中。 如果是这样,我想要他们的用户名和角色。

更新 我只是想从下面的brd6644 的答案中添加我使用的解决方案的详细信息,这样对于查找此内容的其他人来说可能会更容易。我使用this *** 的答案使SecurityContext 可注入。我不会在这个答案中重写代码,所以去看看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>

【问题讨论】:

【参考方案1】:

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

public Map<String, Object> getUserDetails()   
 return AuthenticationResultUtils.getAuthenticationResult();

【讨论】:

这比我做的要好得多。它工作得很好,节省了很多代码。【参考方案2】:

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

GridShore Blog

【讨论】:

评论他博客文章的人似乎遇到了和我一样的问题;主要是从 Flex 中登录和注销很容易,但注意到现有会话并非如此。 brd6644 的解决方案非常适合这一点。【参考方案3】:

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

【讨论】:

好主意,一定会试试这个。

以上是关于如何检查 Spring Security 的用户身份验证并从 Flex 获取角色?的主要内容,如果未能解决你的问题,请参考以下文章

Spring Security:检查用户是不是具有分层角色的方法

如何使用 Spring Security 检查 Java 代码中的“hasRole”?

Spring框架如何检查用户帐户是不是过期?

为啥 Spring Security 的 BindAuthenticator 需要用户读取权限?

Spring Security:如何让用户打开任何页面的监听器?

使用 Spring Security 进行会话管理