Spring Security RunAsManagerImpl不起作用

时间:2016-11-15 13:10:44

标签: spring spring-security spring-boot

我有来自Bean_2的Bean_1调用方法。 Bean_1具有以下安全配置:

    <protect-pointcut expression="execution(* com.proficiency.cg.core.blc.Bean_1.*.*(..))" access="ROLE_Administrators,RUN_AS_InternalRole"/>

Bean_2 - 具有以下安全配置:

<protect-pointcut expression="execution(* com.proficiency.cg.core.blc.Bean_2.*.*(..))" access="ROLE_InternalRole"/>

另外 - 我设置了RunAsManager:

<b:bean id="runAsManager"
    class="org.springframework.security.access.intercept.RunAsManagerImpl">
  <b:property name="key" value="prof_key"/>
</b:bean>

<b:bean id="runAsAuthenticationProvider"
    class="org.springframework.security.access.intercept.RunAsImplAuthenticationProvider">
  <b:property name="key" value="prof_key"/>
</b:bean>

<global-method-security secured-annotations="enabled" run-as-manager-ref="runAsManager" authentication-manager-ref="authenticationManager">

当我运行我的测试程序时 - 访问Bean_2时出现安全异常。 结论:RunAsManager - 无法正常工作或环礁。

1 个答案:

答案 0 :(得分:1)

确定。看起来像RunAsManager有一个bug。调试时 - 我在原始RunAsManagerImpl的实现中发现了以下内容:

public Authentication buildRunAs(Authentication authentication, Object object,
        Collection<ConfigAttribute> attributes) {
    List<GrantedAuthority> newAuthorities = new ArrayList<GrantedAuthority>();

    for (ConfigAttribute attribute : attributes) {
        if (this.supports(attribute)) {
            GrantedAuthority extraAuthority = new SimpleGrantedAuthority(
                    getRolePrefix() + attribute.getAttribute());
            newAuthorities.add(extraAuthority);
        }
    }

一切看起来都不错,但...... 此方法运行所有属性(ROLE_Administrators,RUN_AS_InternalRole),并检查字符串是否以&#34; RUN_AS _&#34;开头。
如果是 - (this.supports(...)) - 创建新的GrantedAuthority(getRolePrefix()+ attribute.getAttribute())。
一切都很好,但getRolePrefix()返回&#34; ROLE _&#34;。实际上 - 它创建了新的GrantedAuthority,如:ROLE_RUN_AS_InternalRole - 它不存在!
作为一个解决方案 - 我创建了自己的RunAsManagerImpl,它覆盖了这个方法,只是剪切了#34; RUN_AS&#34;来自属性之前创建新的GrantedAuthority
我希望这将在下一版本中修复。