我目前正在研究 spring-security 框架 - 到目前为止很棒,印象非常深刻。但是,我还没有找到在哪里或如何定义权限继承。
例如,我希望 ROLE_ADMIN 至少拥有与 ROLE_USER 相同的权限。我为 spring 定义了三个 intercep-url:
<intercept-url pattern="/auth/login.do" access="permitAll"/>
<intercept-url pattern="/voting/*" access="hasRole('ROLE_USER')"/>
<intercept-url pattern="/admin/*" access="hasRole('ROLE_ADMIN')"/>
当尝试从 /voting/ 访问任何嵌套的站点时,以 ROLE_ADMIN 用户身份登录时,我被拒绝了。我在这里错过了什么吗?我知道,我可以为 /voting/* 分支定义多个角色,但如果我想象在我的一个真实用例中我可能有 10 个不同的用户角色,我可以想象 .xml 文件会变得非常混乱,真的快速地。
我可以在某处配置角色的继承吗?
干杯
编辑:
感谢伟大的社区和他们的投入,我想出了一个可行的解决方案——它可能是好的风格,也可能不是——它有效:D
我定义了一个枚举,它反映了继承的 spring-sec 角色:
public enum UserRoles {
ROLE_USER(new String[]{"ROLE_USER"}),
ROLE_ADMIN(new String[]{"ROLE_USER", "ROLE_ADMIN"});
private final String[] roles;
private UserRoles(String[] roles) {
this.roles = roles;
}
public String[] getRoles() {
return roles;
}
}
然后我实现了自己的 UserDetailsService:
方法内
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException, DataAccessException { ... }
在将授予权限添加到 UserDetail 时,我得到相应的枚举值并附加此枚举值定义的所有角色:
List<GrantedAuthority> authList = new ArrayList<GrantedAuthority>(2);
for (String role : UserRoles.ROLE_ADMIN.getRoles()) {
authList.add(new GrantedAuthorityImpl(role));
}
UserDetails user = null;
try {
//user = new User(username, md5.hashPassword(username), true, true, true, true, authList);
} catch (NoSuchAlgorithmException ex) {
logger.error(ex.getMessage(), ex);
}
我持久化的域对象包含一个带有 UserRole 的 @Enumerated 字段 - 在真实环境中,该字段是从数据库中加载的,并从该枚举中选择相应的角色。
再次感谢您的意见 - 爱这个社区 ^^