1. 程式人生 > 其它 >spring-security-learn002自定義使用者

spring-security-learn002自定義使用者

技術標籤:spring security一步一步學

自定義UserDetailsManager

根據之前的圖說明,UserDetails是由他管理的。所以我們自定義來覆蓋

它有兩個實現類:
在這裡插入圖片描述

我們簡化問題,首先使用InMemoryUserDetailsManager。

@Configuration
public class SecurityConfig {
    @Bean
    public UserDetailsManager userDetailsManager(){
        var udm = new InMemoryUserDetailsManager();
        return
udm; } }

當前還沒有UserDetails

新增UserDetails

UserDetails介面的實現:
在這裡插入圖片描述
兩個類,一個介面,我們使用第三個:User。

User有構造器提供我們使用,但更方便的是通過構建者物件構建

 var uds = User.withUsername("dao")
         .password("123")
         .build();

讓UserDetailsManager管理UserDetails

現在二者還沒有聯絡,如何產生聯絡:

udm.createUser(uds);

授權錯誤

現在啟動應用會報錯:

Caused by: java.lang.IllegalArgumentException: Cannot pass a null GrantedAuthority collection

必須指定Authority。

指定授權

 @Bean
 public UserDetailsManager userDetailsManager(){
     var udm = new InMemoryUserDetailsManager();
     var uds = User.withUsername("dao")
             .password("123"
) .authorities("read") .build(); udm.createUser(uds); return udm; }

現在啟動不會有隨機密碼了,我們有自己指定的使用者了。

密碼編碼錯誤

現在用 dao , 123登入會出現錯誤:

java.lang.IllegalArgumentException: There is no PasswordEncoder mapped for the id “null”

新增密碼編碼器

PasswordEncoder有許多實現者,我們先用最簡單的(雖然已過時),原始密碼不加密,這個僅僅用於實驗階段,不能使用在生產環境。

 @Bean
 public PasswordEncoder passwordEncoder() {
     return NoOpPasswordEncoder.getInstance();
 }

現在登入則不會再報錯了。

新增更多的使用者

@Bean
  public UserDetailsManager userDetailsManager(){
      var udm = new InMemoryUserDetailsManager();
      var uds = User.withUsername("dao")
              .password("123")
              .authorities("read")
              .build();

      var uds2 = User.withUsername("king")
              .password("123")
              .authorities("read","write")
              .build();
      udm.createUser(uds);
      udm.createUser(uds2);
      return udm;
  }

現在你使用 king 123登入當然也是OK的。

原始碼

https://github.com/qiudaozhang/spring-security-learn002