授權,權限的控制
令牌里的scope包含fly就有權限訪問。根據Oauth的scope來做權限控制,
要讓@PreAuthorize生效,就要在啟動類里面寫一個注解。
里面有一個屬性叫做,就是在方法的執行之后可以用注解來插入一些方法安全的相關的一些表達式。
這樣orderController里面的注解就會生效了
啟動測試
認證服務器。
網關
orderAPI
申請一個新的令牌
復制生成的這個令牌。
去調用創建訂單的方法
收到一額403 就是不允許訪問。
說明我們這個注解是生效的,因為我們發出的令牌只有read和write
這里把scope改成write
重啟OrderAPI
還是這個令牌,同樣的請求在發送一次
scope這個東西是爭對客戶端應用的。
數據庫內的read、writes是爭對admin這個應用來說的。我發給admin這應用的時候有read和write這兩個scope,但是它無法聚焦到某個人身上。
根據角色hasRole這個表達式
那么這個Role從哪里來呢?我們在分發令牌的時候,寫了一個userDetails的實現類。這里組裝UserDetails接口的實現,這個接口
這個接口里面有個方法 getAuthorizaties
這里指定了authories為ROLE_ADMIN 這個就是我們給用戶指定的角色。這個方法里面實際是可以根據不同的用戶名指定不同的角色的
這里的authorities是可以根據不同的人區分開的。
比如說這里配置為只有 ROLE_USER這個角色才可以訪問
重啟order服務
這個時候就會判斷當前傳來的用戶,authorities里有沒有ROLE_USER
訪問被拒絕,
改成ROLE_ADMIN
再次重啟order服務
可以訪問
這是最簡單的 在方法上是判斷。沒法應用復雜的場景。
角色總是在變,角色也在變。每次改了方法上配置,走要重啟服務。
角色和權限實時變化怎么去做授權?
在網關上做復雜的權限控制。
我們之前在網關上有這么個配置,出了token的請求,都需要做身份認證。
這里修改成access ,你給它指定一個訪問的規則。
request就是當前的請求,authentication就是當前的用戶。
調用一個服務的hasPerission方法,把當前請求和當前用戶傳進去。這個方法返回一個bool,true或false。如果是true你就能訪問,false 就不能訪問。
permissionService從哪里來?這個就要自己去寫了。
聲明一個接口叫做PermissionService。
里面只有一個方法就是hasPermission。authentication里面就包含了用戶的信息。
實現類。
聲明稱一個spring的service
在這里調用你的遠程服務,或者查詢數據庫,或者查redis,或者網關啟動的時候,已經把權限信息緩存到內存里了。
這里應該是真正調用業務邏輯的服務來判斷,這里我們就不調用服務了,打印一些信息。
50%的幾率有權限訪問,50%的幾率沒權限訪問,

這個時候psermissonService實際上是不起作用的。現在網關不認這個permissionService,不知道這個permissionService到底是什么
先申請一個新的令牌,如果令牌過期了的話。



解析表達式失敗了。不知道該怎么解析。

現在要告訴它怎么解析這個psermissionService,讓他知道permissionService技術這個東西

寫一個表達式的處理器


把她聲明成一個組件

注入我們自己寫的permissionService

我們要覆蓋它的一個方法


創建一個評估的上下文來告訴它 permissionService怎么解析。
首先執行以下super的方法,創建一個標准的評估上下文。


在這個標准的評估上下文上,我們去設置一個變量。

有了這個表達式處理器,在表達式里面寫psermissionService這個字符串的時候,她就知道我應該是去調用這個注入進來的psermissionService這個類里面的方法了。
重寫安全配置的方法

注入我們自己寫的表達式處理器。,

配置上表達式處理器,這個時候系統再去解析這個表達式的時候就會用我們自己寫的表達式處理器了

重啟服務測試

50%的成功率 需要多點擊幾次。

失敗的情況

最終的效果,認證服務器里是有權限的服務的。權限服務和訂單服務一樣也是微服務。前端應該也有權限服務的頁面。用戶可以通過調頁面管權限服務。把你的權限邏輯配到服務器里面。

細粒度的權限,到某一個請求,都在網關控制,微服務之間互相調用的時候,只做粗粒度的黑白名單的控制。
結束