學習本章之前,可以先了解下上篇 Spring Security基本配置。
本篇主要講述Spring Security基於表單,自定義用戶認證配置(上篇中的配置,本篇將不再闡述)。一共分為三步:
1、處理用戶信息獲取
2、處理用戶校驗
3、處理密碼加密解密
在配置之前,先熟悉下兩個接口:
UserDetailsService
UserDetailsService接口用戶返回用戶相關數據。它有loadUserByUsername方法,根據用戶名查詢用戶實體,可以實現該接口覆蓋該方法,實現
自定義獲取用戶過程。該接口實現類被DaoAuthenticationProvider類使用,用於認證過程中載入用戶信息
UserDetails與DaoAuthenticationProvider類的介紹可以查看AuthenticationManager、ProviderManager
public interface UserDetailsService { //通過用戶名查詢user UserDetails loadUserByUsername(String username) throws UsernameNotFoundException; }
PasswordEncoder
PasswordEncoder是一個關於密碼操作的接口,常用的實現類為BCryptPasswordEncoder
public interface PasswordEncoder { //對rawPassword加密 String encode(CharSequence rawPassword); //判斷rawPassword與encodedPassword是否匹配 boolean matches(CharSequence rawPassword, String encodedPassword); }
接下來開始Spring Security自定義用戶認證配置:
在SecurityConfig中配置PasswordEncoder
/** * 密碼加密(可自定義加密方式) */ @Bean public PasswordEncoder passwordEncoder() { return new BCryptPasswordEncoder(); }
自定義UserDetails的實現類(也可使用UserDetails的默認實現類User)
@Getter @Setter @AllArgsConstructor public class MyUser implements UserDetails { private static final long serialVersionUID = 1L; private String username; private String password; @Override public Collection<? extends GrantedAuthority> getAuthorities() { return null; } @Override public boolean isAccountNonExpired() { // 賬戶是否沒有過期,默認true return true; } @Override public boolean isAccountNonLocked() { // 賬戶是否沒有鎖定,默認true return true; } @Override public boolean isCredentialsNonExpired() { // 密碼是否沒有過期,默認true return true; } @Override public boolean isEnabled() { // 賬戶是否可用,默認true return true; } }
自定義UserDetailsService的實現類
@Slf4j @Service public class MyUserDetailServiceImpl implements UserDetailsService { @Autowired private PasswordEncoder passwordEncoder; /** * 根據username查詢用戶實體 */ @Override public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { log.info("進來了~"); //密碼加密(這里是將密碼寫死的,真實情況應該是查詢數據庫) String dbPassword = passwordEncoder.encode("1234"); log.info("數據庫密碼:{}", dbPassword); MyUser user = new MyUser(username, dbPassword); return user; } }
在DaoAuthenticationProvider中設置兩個斷點,然后啟動服務,可以看到Spring Security自動將我們的實現類注入到DaoAuthenticationProvider中:
訪問http://localhost:18081/user,跳轉到登錄頁
用戶名隨便輸,密碼為1234