定义具有继承权限的用户角色

chz*_*gla 3 spring rights spring-security security-roles

我目前正在研究 spring-security 框架 - 到目前为止很棒的东西,给人留下了深刻的印象。但是,我还没有找到在哪里或如何定义权限继承。

例如,我希望 ROLE_ADMIN 至少具有与 ROLE_USER 相同的权限。我为 spring 定义了三个拦截网址:

 <intercept-url pattern="/auth/login.do" access="permitAll"/>
 <intercept-url pattern="/voting/*" access="hasRole('ROLE_USER')"/>
 <intercept-url pattern="/admin/*" access="hasRole('ROLE_ADMIN')"/>
Run Code Online (Sandbox Code Playgroud)

当我以 ROLE_ADMIN 用户身份登录时,尝试访问从 /voting/ 嵌套的任何站点时,我被拒绝了。我在这里错过了什么吗?我知道,我可以为 /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;
     }
}
Run Code Online (Sandbox Code Playgroud)

然后我实现了我自己的 UserDetailsS​​ervice:

在方法内

@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException, DataAccessException { ... }
Run Code Online (Sandbox Code Playgroud)

在将授予的权限添加到 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);
        }
Run Code Online (Sandbox Code Playgroud)

我的域对象是持久化的,包含一个带有 UserRole 的 @Enumerated 字段——在真实环境中,这个字段是从数据库加载的,并从该枚举中选择相应的角色。

再次感谢您的投入 - 喜欢这个社区 ^^