[英]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_READ
和AUTHORITY_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.