springboot3專案的搭建四(security登入認證配置)

与f發表於2024-05-31

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

相關文章