2016-03-01 111 views
0

这是Spring Security的RunAsManagerImpl中的错误,还是我的期望错误?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

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

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

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

当然,你可以只更新在SecurityContextHolderAuthentication,但有一个中央实施点“升级”由JVM安全管理器使用时的Authentication对象可以更安全绕过这个代码。

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

+0

你说得对,当然,谢谢。出于某种原因,我将“RUN_AS_关键字的其余部分”解释为没有“RUN_AS_”前缀,并以某种方式设法忽略他们给出的明确示例。正如你所说,很容易重新实现,我只是对我对文档的误解感到困惑。 – DaveyDaveDave