我目前正在研究彈簧安全框架 - 迄今爲止很棒的東西,印象非常深刻。 但是,我還沒有找到在哪裏或如何定義權限的繼承。定義具有繼承權限的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