springboot3專案的搭建四(security登入認證配置)
<!--security安全配置--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</artifactId> <version>${springboot.version}</version> </dependency>
給專案引入security安全依賴後,預設以web形式攔截所有請求. (這是就需要配置,設定一些引數和開放登入的路徑)
security是一系列的過濾器鏈,進行層層攔截,當然我們也可以按照規則自定義過濾器加入鏈中,如之後的驗證碼過濾器(要放在UsernamePasswordAuthenticationFilter之前進行),jwt的token驗證等。
security的認證流程大體是:
https://www.bilibili.com/video/BV1Dt4y1e74H
https://www.bilibili.com/video/BV1ET4y1H7KQ
配置類:
我們重點, 1.寫配置檔案,2.實現介面UserDetailsService 的 loadUserByUsername(username)方法(透過使用者名稱查使用者資訊和許可權列表),返回一個UserDetails 介面的實現類。UserDetails 介面可以自己實現也可以用框架實現好的org.springframework.security.core.userdetails.User
@Service("UserDetailsService") public class MyUserDetailsService implements UserDetailsService { @Override public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { //返回UserDetails介面,我們必須寫一個UserDetails的實現類返回,或者用框架已經寫好的User類 //1.從資料庫中查詢使用者名稱資訊及許可權 2.封裝成UserDetails資料返回 //1)模擬許可權 List<GrantedAuthority> auths = AuthorityUtils.commaSeparatedStringToAuthorityList("admin,manage,ROLE_sale"); //2)模擬使用者資訊 //org.springframework.security.core.userdetails.User; User user = new User("使用者名稱",new BCryptPasswordEncoder().encode("密碼"),auths);//密碼是資料庫獲取的密碼密文 return user; } }
3. 如果自己實現userDetails介面,重寫原有方法外,最好裡面加使用者實體,user_id,token, password ,設定許可權列表等。
獲取到UserDetails 後,框架會自行按照過濾器鏈執行 加密演算法比對密碼密文.
總結:(我們就實現UserDetailsService介面和UserDetails介面)
---------------------------------------------------
方法一:如果用原始登入,不改原始login頁面, 實現兩個介面,1.UserDetailsService 2.UserDetails .最後配置下,登入成功的著陸頁。
(大多數都是預設的類,manager委託provider去驗證...)
方法二:如果使用json的jwt方式驗證,我們在配置檔案中自己生成manager 和 provider去驗證。
上圖是,在配置檔案中,配置一個authenticationManage的Bean, Spring在啟動時會載入,把自定義UserDetailsService和密碼驗證加入,在驗證時使用.
上圖是,我們自己寫登入地址是,把使用者名稱和密碼封裝成UsernamePasswordAuthenticationToken後,使用上面配置的Bean,進行驗證,呼叫的都是我們自定義的UserDetailsService和密碼加密演算法。
配置類:
此外,1.我們還可以定義Handle繼承相應介面,完善驗證功能。(如認證失敗處理類AuthenticationEntryPointImpl,退出處理器LogoutSuccessHandlerImpl)
//認證失敗處理器 //http.exceptionHandling().authenticationEntryPoint(customAuthenticationEntryPoint);
2.我們還可以寫過濾器,載入原始的過濾器鏈的指定位置。(如token認證過濾器JwtAuthenticationTokenFilter,驗證碼驗證邏輯過濾器ValidateCodeFilter)
// 新增JWT filter (驗證碼過濾器,載入使用者密碼驗證器之前) httpSecurity.addFilterBefore(authenticationTokenFilter, UsernamePasswordAuthenticationFilter.class);
// 配置登入之前新增一個驗證碼的過濾器 http.addFilterBefore(validateCodeFilter, UsernamePasswordAuthenticationFilter.class);
未完.....
https://docs.spring.io/spring-security/reference/index.html
https://blog.csdn.net/2301_78646673/article/details/134801772
https://www.jb51.net/article/281314.htm
https://www.cnblogs.com/fps2tao/p/17409309.html
https://www.cnblogs.com/fps2tao/p/17356448.html
https://www.cnblogs.com/fps2tao/p/17393274.html
https://blog.csdn.net/qq_63218110/article/details/136095651