2011-06-06 88 views
1

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

然後我實現我自己的UserDetailsS​​ervice:

內梅索德

@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場 - 在真實的環境中,該字段從數據庫加載和相應的角色是從枚舉採摘。再次輸入

感謝 - 愛這個社會^^

+1

通常的模式是在配置級執行此操作,以便管理員擁有_both_'ROLE_USER'和'ROLE_ADMIN'。這實際上也允許更細緻的可能性(例如,不能投票的管理員)。 – 2011-06-07 10:08:31

+0

恩......好點!所以我實際上可以編寫自己的UserDetailsS​​ervice實現,並確保爲用戶提供正確的角色。謝謝! – chzbrgla 2011-06-07 10:53:56

回答

1

據我所知,Spring Security沒有支持角色和權限的概念。在Spring中,安全性只是有時稱爲權限的角色 - 而且:在Spring中,安全性是角色/權限,角色和權限系統稱爲特權。


所以,如果你想建立角色和權限的系統,那麼你需要你的一個通過建立自己的Spring Security的AuthenticationManager做到這一點,和胎面Spring Security的角色/機構享有特權。

@see此博客:Spring Security customization (Part 1 – Customizing UserDetails or extending GrantedAuthority) - 它針對春季安全2.0編寫,並展示瞭如何實現我在說什麼。它還stayes是RoleHierarchy也有一些缺點,但這篇文章是關於2.0,可能的弊端都不見了在3.0

+0

所以我必須提供hasAnyRole([role1,role2])的列表?該死..不太好:) – chzbrgla 2011-06-06 17:25:19

+0

你可以有其他類型的權限比角色。例如,在我的應用程序中,我將本地用戶標識描述爲權限(儘管它們當然不用於角色投票,但它們對於應用安全配置的其他部分是必需的)。 – 2011-06-07 10:06:03

+0

看起來像這樣的答案是不是最新的,因爲在春季4的角色和使用略有不同的方式 – kiedysktos 2017-03-23 13:15:03