我目前正在研究弹簧安全框架 - 迄今为止很棒的东西,印象非常深刻。 但是,我还没有找到在哪里或如何定义权限的继承。定义具有继承权限的userroles
例如我希望ROLE_ADMIN至少具有与ROLE_USER相同的权限。我定义为春季3 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')"/>
当试图访问任何网站从/投票/筑巢,同时登录的用户ROLE_ADMIN,我被拒绝。我在这里错过了什么吗?我知道,我可以为/ voting/*分支定义几个角色,但是如果我想象我可能在我的现实生活中有10个不同的用户角色,我可以想象.xml文件变得非常混乱,真的快速。
我可以配置角色的继承吗?
欢呼
编辑:
感谢伟大的社会和他们的意见,我想出了一个可行的解决方案 - 这可能是良好的作风还是没有 - 它的工作原理:d
我定义反映了继承弹簧秒角色枚举:
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场 - 在真实的环境中,该字段从数据库加载和相应的角色是从枚举采摘。再次输入
感谢 - 爱这个社会^^
通常的模式是在配置级执行此操作,以便管理员拥有_both_'ROLE_USER'和'ROLE_ADMIN'。这实际上也允许更细致的可能性(例如,不能投票的管理员)。 – 2011-06-07 10:08:31
恩......好点!所以我实际上可以编写自己的UserDetailsService实现,并确保为用户提供正确的角色。谢谢! – chzbrgla 2011-06-07 10:53:56