我有来自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 - 无法正常工作或环礁。
答案 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
我希望这将在下一版本中修复。