【发布时间】:2014-03-04 09:53:15
【问题描述】:
在我正在工作的项目中,我们根据角色 ID 而不是角色描述进行身份验证,并且此映射存储在数据库中。
我的问题是,如何删除 Spring Security 的 RoleVoter 前缀以实现上述设计?
【问题讨论】:
在我正在工作的项目中,我们根据角色 ID 而不是角色描述进行身份验证,并且此映射存储在数据库中。
我的问题是,如何删除 Spring Security 的 RoleVoter 前缀以实现上述设计?
【问题讨论】:
Spring security RoleVoter需要一个前缀来区分作为角色的授权权限,有关更多详细信息,请参阅此answer。
如果您想更改此设置,您可以随时提供自己的自定义 AccessDecisionManager and configure it with a customRoleVoter`。
这是此类自定义访问决策管理器的示例:
public class MyAccessDecisionManager extends AffirmativeBased {
public MyAccessDecisionManager() {
super();
List<AccessDecisionVoter> decisionVoters = new ArrayList<AccessDecisionVoter>();
RoleVoter roleVoter = new MyCustomRoleVoter();
decisionVoters.add(roleVoter);
AuthenticatedVoter authenticatedVoter = new AuthenticatedVoter();
decisionVoters.add(authenticatedVoter);
setDecisionVoters(decisionVoters);
}
并且使用它来代替默认的访问决策管理器:
<bean id="myAccessDecisionManager" class="full.package.name.MyAccessDecisionManager" />
<security:http access-decision-manager-ref="myAccessDecisionManager">
...
</security:http>
【讨论】:
spring-security.xml中如何配置?
可能有人需要基于 Web 应用程序的注释来决定
@Configuration
@EnableGlobalMethodSecurity(securedEnabled = true)
protected static class GlobalSecurityConfig extends GlobalMethodSecurityConfiguration {
@Override
protected AccessDecisionManager accessDecisionManager() {
AffirmativeBased accessDecisionManager = (AffirmativeBased)super.accessDecisionManager();
for(AccessDecisionVoter voter: accessDecisionManager.getDecisionVoters()){
if(voter instanceof RoleVoter){
// do what you whant
}
}
return accessDecisionManager;
}
}
@Configuration
@EnableWebSecurity
protected static class WebSecurityConfiguration extends WebSecurityConfigurerAdapter {
@Bean
@Primary
public AccessDecisionManager accessDecisionManager() {
List<AccessDecisionVoter<? extends Object>> decisionVoters = Arrays.asList(
new WebExpressionVoter(),
new RoleVoter(),
new AuthenticatedVoter()
);
return new AffirmativeBased(decisionVoters);
}
}
【讨论】:
从 Spring 4 开始,将 hasRole("X") 替换为 hasAuthority("X")。
https://docs.spring.io/autorepo/docs/spring-security/4.0.0.RC1/reference/html/el-access.html
【讨论】: