前面的加依賴、配置使用者名稱密碼啥的就略過了,大家隨便百度谷歌都可以做出來,這邊文章主要講比較詳細的原理;
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屬性:
之後在控制層通過註解的形式設定好訪問路徑所需要的許可權: