簡體   English   中英

java spring:如何區分用戶角色和權限?

[英]java spring : how can I separate user roles and authorities?

我目前的理解是 Spring 不區分角色和權限,唯一的區別是角色名稱的ROLE_首字母縮寫詞。

我希望實現的是具有權限的角色。 Aka 如果我給用戶角色 ADMIN,他將獲得所有相關的權限(假設權限訪問網站上的路由以更新頁面為例)

我當前的實現如下:我有一個自定義特權 class,它與角色 class 具有多對多關系,與用戶的 class 具有多對多關系。 public Collection<? extends GrantedAuthority> getAuthorities() 調用 UserDetails 的public Collection<? extends GrantedAuthority> getAuthorities() ,它遍歷所有權限並獲取。

@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;
}

我的問題:有沒有更好的方法(最好是 spring 安全性原生)?

編輯:角色在數據庫中,以便允許動態插入新角色。 當前權限也是,但可能會被刪除以進行硬編碼(動態權限在此特定實現中沒有多大意義)

您需要擴展 WebSecurityConfigurerAdapter 來實現這一點,如下所示:

@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 安全性限制/允許訪問不同端點/URI 的方式。 請注意最后一行,它限制了所有以/only/for/admin開頭的 URL 對除 Admin 之外的所有角色/權限的訪問。 希望你明白了。 有關完整示例,請查看此處此處

您可以公開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_READAUTHORITY_WRITE
如果用戶有ROLE_USER那么他們也有AUTHORITY_READ

您可以使用換行符\n來分隔多個角色層次結構。

最后我選擇了這個方法:

@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;
}

它的最大優點是在每個端點請求時都會調用它,使其成為動態的(我可以添加/刪除角色和權限,而無需用戶注銷/登錄使其生效)

這也使我可以相對輕松地進行擴展,因為它可以通過界面和/或腳本進行控制

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM