簡體   English   中英

使用 Spring 安全性實現 UserDetail 和 UserDetailService 的自定義用戶、角色、權限

[英]Custom User, roles, permissions implementing UserDetail and UserDetailService with Spring Security

我希望使用 Spring 安全性 w/MySql 來存儲用戶、角色、權限(權限)。 我做了以下事情:

ApplicationUser(id、firstName、lastName、username、password、 roles
ApplicationRole (id, name, description, permissions ) 實現 GrantedAuthority
ApplicationPermission (id, name, description) 實現 GrantedAuthority

我創建了一個實現 UserDetailService 的 class。 在 loadUserByUsername 方法中,我執行以下操作:

ApplicationUser applicationUser = userRepository.findByUsername(username);
if(applicationUser == null) {
    throw new UsernameNotFoundException(username);
}

// Extract role/role permission grantedAuthorities from db user
List<GrantedAuthority> grantedAuthorities = new ArrayList<>();
for (Role role: applicationUser.getRoles()) {
    grantedAuthorities.add(role);
    grantedAuthorities.addAll(role.getPermissions());
}

return new User(applicationUser.getUsername(), applicationUser.getPassword(), grantedAuthorities);

然而,這仍然讓我有點困惑,這里有一些我的問題......

  1. 是否有必要在我的 ApplicationRole 和 ApplicationPermission class 上實現 GrantedAuthority。 在我見過的許多例子中,我沒有看到其他人這樣做,但它似乎讓我的生活更輕松,所以我可以得到它們並按原樣傳遞它們。
  2. 我沒有用我的 ApplicationUser class 實現 UserDetails。 如果我這樣做,目的是什么? 是我能夠自定義 getAuthorities、isAccountNonExpired、isAccountNonLocked、isCredentialsNonExpired、isEnabled 方法的唯一原因嗎? 是否有這些方法的默認實現,或者只有我創建我的版本。 如果我已經在 UserDetailsServiceImpl 中使用 loadbyUserName 來實現 getAuthorities,為什么還需要在這里實現呢?
  3. SimpleGrantedAuthority 的目的是什么? 我看到它實現了 GrantedAuthority 並且只接受一個字符串名稱。 但是,我覺得我不需要使用它,因為我使用我的 ApplicationRole 和 ApplicationPermission 類實現了 GrantedAuthority。

我認為我的問題是我對何時/如何正確實施 UserDetail 和 UserDetailService 感到困惑,以確保我從數據庫中加載權限並在每次用戶登錄時設置它們。此外,使用 GrantedAuthority 實施是否有任何意義我的 ApplicationRole 和 ApplicationPermission class 我是這樣的嗎?

  1. 這不是必需的,我也不推薦它。 最好將應用程序的這些不同方面分開。 據我所知,在您的自定義UserDetailsService ervice 中獲取角色並將其文本表示形式包裝在SimpleGrantedAuthority (即他們的名稱)中是一種常見的做法。 請注意,為了區分 Spring Security 中的角色和權限,您必須在默認情況下為角色添加ROLE_標記(請參閱hasRolehasAuthority訪問控制表達式)。

  2. 擁有自定義UserDetails實現不是必需的,但可能有好處,例如,您可以存儲特定於您的應用程序的額外字段。 默認實現是org.springframework.security.core.userdetails.User ,大多數時候你可以擴展這個。

  3. 見#1

以我的方式使用我的 ApplicationRole 和 ApplicationPermission class 實現 GrantedAuthority 有什么意義嗎?

這沒有任何意義,不。 現有實現涵蓋了許多用例,但對於最簡單的用例,您可以堅持使用SimpleGrantedAuthority

暫無
暫無

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

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