spring-security-learn002自定義使用者
阿新 • • 發佈:2021-01-04
技術標籤: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