雖然前面我們實現了通過數據庫來配置用戶與角色,但認證規則仍然是使用 HttpSecurity 進行配置,還是不夠靈活,無法實現資源和角色之間的動態調整。
要實現動態配置 URL 權限,就需要開發者自定義權限配置,具體步驟如下。
四、基於數據庫的URL權限規則配置
1,數據庫設計
這裏的數據庫在前文(點擊查看)的基礎上增加一張資源表和一張資源角色管理表,並添加一些預置數據:
- 資源表中定義了用戶能夠訪問的 URL 模式。
- 資源角色表則定義了訪問該模式的 URL 需要什麼樣的角色。
2,創建實體類
在前文的基礎上再創建一個資源表對應的實體類。
1 2 3 4 5 6 7 |
|
3,創建數據庫訪問層
(1)首先創建 MenuMapper 接口:
1 2 3 4 |
|
(2)接着在 MenuMapper 相同的位置創建 MenuMapper.xml 文件,內容如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
|
(3)由於在 Maven 工程中,XML 配置文件建議寫在 resources 目錄下,但上面的 MenuMapper.xml 文件寫在包下,Maven 在運行時會忽略包下的 XML 文件。因此需要在 pom.xml 文件中重新指明資源文件位置,配置如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
|
4,自定義 FilterInvocationSecurityMetadataSource
要實現動態配置權限,首先需要自定義 FilterInvocationSecurityMetadataSource:
注意:自定義 FilterInvocationSecurityMetadataSource 主要實現該接口中的 getAttributes 方法,該方法用來確定一個請求需要哪些角色。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 |
|
5,自定義 AccessDecisionManager
當一個請求走完 FilterInvocationSecurityMetadataSource 中的 getAttributes 方法後,接下來就會來到 AccessDecisionManager 類中進行角色信息的對比,自定義 AccessDecisionManager 代碼如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 |
|
6,配置 Spring Security
這裏與前文的配置相比,主要是修改了 configure(HttpSecurity http) 方法的實現並添加了兩個 Bean。至此我們邊實現了動態權限配置,權限和資源的關係可以在 menu_role 表中動態調整。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 |
|
7,運行測試
(1)啓動項目,我們使用 hangge 用戶進行登錄,由於該用戶具有 USER 角色,所以登錄後可以訪問 /hello、 /user/hello 這兩個接口。
(2)而由於 /db/hello 接口需要 DBA 角色,因此 hangge 用戶仍然無法訪問。