個人博客網:https://wushaopei.github.io/ (你想要這里多有)
1、Spring Security 權限管理框架介紹
簡介: Spring Security 提供了基於javaEE的企業應有個你軟件全面的安全服務。這里特別強調支持使用SPring框架構件的項目,Spring框架是企業軟件開發javaEE方案的領導者。
Spring Security 的兩個目標: “認證” 與“授權”。
- “認證”,是建立一個他聲明的主題的過程(一個“主體”一般是指用戶,設備或一些可以在你的應用程序中執行動作的其他系統)。
- “授權” 指確定一個主體是否允許在你的應用程序執行一個動作的過程。為了抵達需要授權的店,主體的身份已經有認證過程建立。這個概念是通用的而不只在Spring Security中。
在SpringSecurity 中,請求進入后會被攔截器攔截到,並交由認證管理器首先處理;這是在身份驗證層,Spring Security 的支持多種認證模式。包括 Basic、Digest、X.509、LDAP、Form(基於表單的認證) 等多種HTTP 認證。
淺析:
Basic 認證:在HTTP1.0提出的認證方法,針對特定的用戶和資源,需要提供特定的密碼認證后方可訪問,其中密碼是使用明文傳輸的;一個請求到來時,瀏覽器彈出對話框,讓用戶輸入用戶名和密碼,並用BASE 64 進行編碼進行傳輸,服務器接受並解析這些信息,並認證通過,才會允許繼續訪問。
Digest認證: 解決Basic 認證的安全問題,當訪問時,瀏覽器依舊彈出對話框,讓用戶輸入用戶名和密碼,瀏覽器會對用戶名、密碼、HTTP請求方法、被請求資源的URI進行組合后進行MD5運算,然后把計算得到的摘要信息發送給服務器;服務器獲取報文頭部相關認證信息后獲取到 username ,同時獲取到密碼,同樣對用戶名、密碼、HTTP請求方法、被請求資源的URI進行組合后和 response 進行比較,如果相同,才算認證通過。
2、Spring Security 常用權限攔截器:
主要功能性攔截器有 11 個, FilterChainProxy 對攔截器進行過濾操作並代理執行!
3、Spring Security 項目 Demo
(1)環境搭建及使用
- 基於Spring Boot + Spring Security 環境
- 常用 Case 實現
(2)創建SpringBoot 工程
(3)整合SpringSecurity 依賴
(4)主啟動類配置:
(5)配置 Servlet 初始化
(6)啟動SpringBoot 項目- - run 主啟動類:
啟動SpringBoot 項目進行接口訪問時,彈出登錄界面,說明SpringSecurity生效了
4、SpringSecurity攔截配置:
注意:在 3 的基礎上,對工程進一步配置:
(1)創建 SpringSecurityConfig 類管理 攔截配置:
該 SpringSecurityConfig 繼承 WebSecurityConfigurerAdapter 類,並重寫 configure(HttpSecurity http)和 configure(WebSecurity web)兩個方法,分別針對 接口請求 和 靜態頁面 資源進行攔截。
接口請求: ip:port/ 的請求一律通過,主要進入到 Bootstrap 中的 RequestMapping(“/”)接口中;並對 “/”后帶有標識地址的請求進行攔截認證;
靜態資源: 此處對靜態 js 、css、images 三者進行放行。
效果截圖:
配置 SpringSecurity 后,默認可以通過 “/” 的接口請求; 而當進行 如“/hello”接口請求時會被攔截進行驗證
5、基於SpringSecurity 權限管理 Case 實操
權限管理 Case 的需求有兩個要求:
- 第一點 :只要能登錄即可;
- 第二點:有指定的角色,每個角色有指定的權限.
(1)只要能登錄即可,功能體現:
在SpringSecurityConfig.java中配置用戶信息:
注意 :
解決方法:
創建PasswordEncorder 實體類后可通過兩種方式完成明文驗證通過:
第一種:直接在配置好的 PasswordEncorder 類上添加 @Component 裝配 MyPasswordEncoder 為Bean 注入到容器即可;
然后繼續使用
進行 密碼明文登錄,可以成功
第二種:在auth.inMemoryAuthentication()后面使用.passwordEncoder(new MyPasswordEncoder())對登錄信息進行包裝后提交即可;這樣也可以成功
推薦: 最好是使用第一種 裝載成 Bean 后注入容器,對於開發效率更高,也更便捷。
(2)有指定的角色,每個角色有指定的權限,功能體現:
① 創建接口 role1() 並對其添加 @PreAuthorize("hasRole('ROLE_ADMIN')") 以進行角色攔截
(2)角色攔截 - - 功能解析:
@PreAuthorize("hasRole('ROLE_ADMIN')") 注解說明:
②並在 SpringSecurityConfig.java 中創建新用戶,以提供測試:
③ 創建好接口后,進行登錄嘗試,發現,使用 用戶為 demo ,角色 為 DEMO 依舊可以通過該接口
問題解析:
這是因為還需要再添加一個@EnableGlobalMethodSecurity(prePostEnabled = true) 注解到 啟動器上,以讓 @PreAuthorize("hasRole('ROLE_ADMIN')") 這個注解生效,完整 啟動類代碼如下:
添加注解后:
使用 demo 進行登錄:
使用admin進行登錄:
(3)數據庫管理實現:
通過數據庫獲取用戶信息進行登錄認證
創建 MyUserService.java類,並裝載 Bean 到 容器中,在SpringSecurityConfig.java 中進行配置:
SpringSecurityConfig.java 中 configure(AuthenticationManagerBuilder auth)方法修改為通過注入MyUserService 的Bean實現數據庫查詢
密碼的自定義驗證:
創建 MyPasswordEncoder 類,實現 PasswordEncoder 接口類;重寫 encode(CharSequence obj和 matches(CharSequence obj,String str) 方法:
說明:第一個是加密的方法,第二個是匹配密碼,具體操作是加密方法加密后與原始密碼在匹配方法中進行匹配
底層邏輯解析:
引入自定義的登錄信息驗證器
相關注解說明:
@PreAuthorize("hasRole('ROLE_ADMIN')") 方法調用前進行權限檢查
@PostAuthorize("hasRole('')") 方法調用后進行權限檢查
@PreFilter("") 方法調用前針對集合類參數或返回值進行過濾
@PostFilter("") 方法調用后針對集合類參數或返回值進行過濾
6、Spring Security 的優缺點
優點:
提供了一套安全框架,而且這個框架是可以用的;
提供了很多用戶認證的功能,實現相關接口即可,節約大量開發工作;
基於spring,易於集成到 spring 項目中,且封裝了許多方法。
缺點:
配置文件多,角色被“編碼”到配置文件盒源文件中,RBAC 不明顯;
對於系統中用戶、角色、權限之間的關系,沒有可操作的界面;
大數據量情況下,幾乎不可用。
https://github.com/wushaopei/SPRING_BOOT/tree/master/Spring-boot-Security