javaspring:如何分离用户角色和权限?

mwyxok5s  于 2021-07-13  发布在  Java
关注(0)|答案(3)|浏览(374)

我目前的理解是,spring没有区分角色和权威,唯一的区别是 ROLE_ 角色名称的缩写。
我希望实现的是具有权限的角色。也就是说,如果我给一个用户角色admin,他将获得所有相关的特权(例如访问网站上的路由以更新页面的权限)
我当前的实现如下:我有一个自定义特权类,它与roles类有多对多关系,roles类与用户的类有多对多关系。当 public Collection<? extends GrantedAuthority> getAuthorities() 在调用userdetails之后,它迭代所有权限并获取。

@Override
public Collection<? extends GrantedAuthority> getAuthorities() {
    List<SimpleGrantedAuthority> authorities = new ArrayList<>();
    for (Role role : this.roles) {
        for (Privilege pri : role.getPrivileges()) {
            SimpleGrantedAuthority auth = new SimpleGrantedAuthority(pri.getName());
            if (!authorities.contains(auth)) {
                authorities.add(auth);
            }
        }
    }
    return authorities;
}

我的问题是:有没有更好的方法(最好是SpringSecurity自带的)?
编辑:角色位于数据库中,以便动态插入新角色。当前权限太多,但可能会被删除以进行硬编码(在这个特定实现中,权限是动态的没有多大意义)

zfycwa2u

zfycwa2u1#

您需要扩展WebSecurityConfigureAdapter以实现以下目标:

@Configuration
@EnableWebSecurity
@ComponentScan(basePackages = "com.spring.boot.rocks")
public class ConfigWebSecurity extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity httpSecurity) throws Exception {
    httpSecurity.authorizeRequests().antMatchers("/css/**")
            .permitAll();
httpSecurity.authorizeRequests().antMatchers("/only/for/admin/**").access("hasAuthority('ADMIN')")
....
....
}

这就是如何使用Spring Security 限制/允许对不同端点/uri的访问。注意最后一行,它限制了以 /only/for/admin 对于除管理员以外的所有角色/权限。希望你有这个想法。一个完整的例子,看看这里和这里。

mu0hgdu0

mu0hgdu02#

你可以揭露 RoleHierarchy bean来创建角色和权限之间的层次结构。

@Bean
public RoleHierarchy roleHierarchy() {
    RoleHierarchyImpl roleHierarchy = new RoleHierarchyImpl();
    roleHierarchy.setHierarchy(
            "ROLE_ADMIN > AUTHORITY_READ\n" +
            "ROLE_ADMIN > AUTHORITY_WRITE\n" +
            "ROLE_USER > AUTHORITY_READ");
    return roleHierarchy;
}

此示例说明如果用户 ROLE_ADMIN 然后他们也有 AUTHORITY_READ 以及 AUTHORITY_WRITE .
如果用户有 ROLE_USER 然后他们也有 AUTHORITY_READ .
可以使用换行符定义多个角色层次结构 \n 把他们分开。

ltqd579y

ltqd579y3#

最后我选择了这个方法:

@Override
public Collection<? extends GrantedAuthority> getAuthorities() {
    List<SimpleGrantedAuthority> authorities = new ArrayList<>();
    for (Role role : this.roles) {
        insert_auth(authorities, "ROLE_" + role.getName());
        for (Privilege pri : role.getPrivileges()) {
            insert_auth(authorities, pri.getName());
        }
    }
    return authorities;
}

它的最大优点是在每个端点请求时都会调用它,从而使其成为动态的(我可以添加/删除角色和权限,而用户无需注销/登录即可使其生效)
这也允许我相对容易地进行伸缩,因为它可以通过接口和/或脚本进行控制

相关问题