这是Spring Security的RunAsManagerImpl
中的错误,还是我的期望错了?
我对(有限)文档的理解是,如果我在下面调用RunAsManagerImpl
,我的配置中定义了doFoo()
:
@Secured({"ROLE_FOO", "RUN_AS_BAR"})
public void doFoo() {
doBar();
}
@Secured("ROLE_BAR")
public void doBar() {
// ...
}
然后,如果当前Authentication
具有“FOO”角色,doBar()
将成功执行。
但事实并非如此,Spring抛出了AccessDeniedException。但是,将doBar()
的注释更改为:
@Secured("ROLE_RUN_AS_BAR")
成功运作。
在检查source code时,原因相当清楚 - 如果遇到以“RUN_AS_”开头的属性,它会创建:
GrantedAuthority extraAuthority = new SimpleGrantedAuthority(getRolePrefix() + attribute.getAttribute());
默认情况下:
private String rolePrefix = "ROLE_";
因此,应用的权限是“ROLE_RUN_AS_BAR”,这似乎根本不对。这是我应该提出的错误,还是我误解了这个功能的用途?
答案 0 :(得分:1)
这是预期的行为,如文档中所述:
创建的GrantedAuthorityImpls将以特殊为前缀 前缀表示它是一个角色(默认前缀值是ROLE_), 然后是RUN_AS_关键字的其余部分。例如,RUN_AS_FOO 将导致创建ROLE_RUN_AS_FOO的授权权限。
这种基本实现的目的不是模仿用户,而是获得“技术角色”。例如,代码的某些部分应该需要“数据库管理器”的技术角色。没有用户具有此角色,但我可以通过编程方式获得。
当然,您只需更新Authentication
中的SecurityContextHolder
即可绕过此代码,但使用“升级”Authentication
对象的中央实施点在使用时可能更安全由一名jvm安全管理员。
但是,RunAsManager
是一个非常简单的界面,以便轻松重新实现:如果默认行为与您需要的不匹配,则只有一种方法可以重新实现。