Spring Security的RunAsManagerImpl是否有效?

时间:2016-03-01 17:34:11

标签: spring spring-security

这是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”,这似乎根本不对。这是我应该提出的错误,还是我误解了这个功能的用途?

1 个答案:

答案 0 :(得分:1)

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

  

创建的GrantedAuthorityImpls将以特殊为前缀   前缀表示它是一个角色(默认前缀值是ROLE_),   然后是RUN_AS_关键字的其余部分。例如,RUN_AS_FOO   将导致创建ROLE_RUN_AS_FOO的授权权限。

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

当然,您只需更新Authentication中的SecurityContextHolder即可绕过此代码,但使用“升级”Authentication对象的中央实施点在使用时可能更安全由一名jvm安全管理员。

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