Spring Security';什么是RunAsManagerImpl工作?

Spring Security';什么是RunAsManagerImpl工作?,spring,spring-security,Spring,Spring Security,这是Spring Security的RunAsManagerImpl中的一个bug,还是我的期望是错误的 我对(有限的)文档的理解是,如果我在下面调用doFoo(),我的配置中定义了RunAsManagerImpl: @Secured({"ROLE_FOO", "RUN_AS_BAR"}) public void doFoo() { doBar(); } @Secured("ROLE_BAR") public void doBar() { // ... } 然后,如果当前的身份验证具

这是Spring Security的
RunAsManagerImpl
中的一个bug,还是我的期望是错误的

我对(有限的)文档的理解是,如果我在下面调用
doFoo()
,我的配置中定义了
RunAsManagerImpl

@Secured({"ROLE_FOO", "RUN_AS_BAR"})
public void doFoo() {
  doBar();
}

@Secured("ROLE_BAR")
public void doBar() {
  // ...
}
然后,如果当前的
身份验证
具有“FOO”角色,
doBar()
将成功执行

但事实并非如此,Spring抛出了AccessDeniedException。但是,将
doBar()
的注释更改为:

@Secured("ROLE_RUN_AS_BAR")
工作顺利

检查后,原因相当清楚-如果遇到以“RUN_AS_”开头的属性,则会创建:

GrantedAuthority extraAuthority = new SimpleGrantedAuthority(getRolePrefix() + attribute.getAttribute());
其中,默认情况下:

private String rolePrefix = "ROLE_";

因此,应用的权限是“角色运行”和“角色栏”,这似乎根本不正确。这是我应该提出的错误,还是我误解了此功能的预期用途?

这是预期行为,如文档中所述:

创建的GrantedAuthorityImpls将以特殊 表示它是一个角色的前缀(默认前缀值为role_), 然后是RUN_AS_u关键字的剩余部分。例如,将_作为_FOO运行 将导致创建角色_RUN _AS _FOO的授权

这种基本实现的目的不是模仿用户,而是获得“技术角色”。例如,代码的某些部分需要“数据库管理器”的技术角色。没有用户具有此角色,但可以通过编程方式获取我

当然,只需更新
SecurityContextHolder
中的
Authentication
,就可以绕过此代码,但是当jvm securitymanager使用
Authentication
对象时,有一个“升级”该对象的中心实现点可以更安全


然而,
RunAsManager
是一个非常简单的界面,以便轻松地重新实现:如果默认行为与您需要的不匹配,您只有一种方法可以重新实现。

当然,您是对的,谢谢。出于某种原因,我把“剩余的RUN_AS_u关键字”理解为没有“RUN_AS_u”前缀的意思,并设法忽略了他们给出的清晰示例。正如你所说,重新实现很容易,我只是被我对文档的误解弄糊涂了。