Spring Security認證配置(一)


學習本章之前,可以先了解下上篇 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

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM