Spring Security詳解


前面的加依賴、配置用戶名密碼啥的就略過了,大家隨便百度谷歌都可以做出來,這邊文章主要講比較詳細的原理;

Spring Security無非就是登錄授權!但是其實涉及的內容極多,包括各種防護手段啥的;

 Spring Security強制要密文存儲的,所有定制了一個PasswordEncoder接口:

publicinterface PasswordEncoder {
    String encode(CharSequence rawPassword);
    boolean matches(CharSequence rawPassword, String encodedPassword);
    default boolean upgradeEncoding(String encodedPassword) {
        returnfalse;
    }
}

這里的encode是明文加密之后返回的密文;

matches就是把用戶登錄的明文密碼和數據庫中保存的密文密碼做參數,返回一個boolean值判斷能否登錄;

upgradeEncoding是指再次加密,這個一般不會用到;

開始配置:

 

 

 這里重寫的configure方法是有3個重載的,對應的參數分別是:

AuthenticationManagerBuilder auth

HttpSecurity http

WebSecurity web

auth這個是用來做用戶、密碼、權限操作;web是用來做忽視url,常用於一些靜態文件;http是用來做頁面訪問,包括對於的訪問路徑是否需要驗證,是否要添加一些自定義的過濾器,定義成功或失敗的回調函數successHandler和failureHandler等等;

在參數auth的這個重寫方法configure需要配置對應的用戶、密碼以及權限,而這些是通過查詢數據庫找到的,所有一般會把這些信息封裝為一個對象:UserDetails:

 

 這里面也定義了一些判斷方法,認證的操作,框架都已經幫你實現了,它定義了一個UserDetailsService接口,你只需去實現就好,然后把UserDetails返回再把UserDetailsService注入到容器中就可以了;

 

 這里的AdminUserDetails是實現類UserDetails接口的類;

最后在configure方法里配置好就可以:

 

 UsernamePasswordAuthenticationToken:這里是對UserDetails的再一次封裝:

 

 

 這里的principal和credentials可以近似看作用戶、密碼;不過Objects類型,便於封裝,就如此例的userDetails;

 

 

 

再梳理一下整個登錄認證過程:

1、

 

 

 通過username查到封裝了用戶密碼以及權限的對象,注意這個對象可以是自己自定義,且這里的loadUserByUsername方法調用的是自己配置好的:

 

 

 2、根據拿到的userDetails對象拿到數據庫里的password和傳入來的password做匹配,如果認證成功,則對UserDetails再一次封裝后存入代表當前用戶上下文的SecurityContext:

 

 

 如失敗則返回提示;如要做jwt也是在這之后生成token並發給客戶端;

授權:

之前的UsernamePasswordAuthenticationToken其實就已經把用戶對應的權限以Collections形式封裝進去了,如下圖里對應的authoriities屬性:

 

 

 

之后在控制層通過注解的形式設置好訪問路徑所需要的權限:

 


免責聲明!

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



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