2011-06-06 64 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