限流的改造。
同樣注意,不要聲明成Spring的Bean
在上面聲明Rateliiter
如果能獲取到權限繼續往下走,沒權限就返回,to many request的錯誤信息。
加到過濾器鏈上
加載Spring Scurity過濾器鏈的第一個過濾器之前。
啟動網關,測試
復制獲取到的令牌。
先走的限流,然后是認證的filter,認證的filter是spring secutiry寫的
最終回到日志的過濾器,把日志更新掉。
梳理
左邊本質上都是過濾器,雖然最后一個不是叫做什么什么filter。右邊都是自己寫的一些組件。組件的作用是改變過濾器的行為。
在過濾器鏈上,綠色是我們自己寫的,藍色是Spring Security提供的,自己寫的組件注入到Spring的過濾器里面,來改變或者是增強Spring 自己的過濾器里面的行為。
1.限流
2.從jwt或者其他的這些令牌里面,把當前的用戶 身份提取出來
3。審計日志
4.從名字看是異常的轉換過濾器。本身並沒有任何業務邏輯。他的作用就是catch后面這個Interceptor拋出的來的異常,
5.作用就是判斷權限,我們寫的permissonSerice最終就是在這里生效的。
一個請求過來,他會按照這個順序,經過所有的過濾器。當然還有一些其他的過濾器,就是SpringSecurity過濾器鏈上的其他過濾器。這些和我們核心講 的沒關系,我們就把它忽略了。但是跟我講的安全相關的,就是核心的幾個安全相關的過濾器都列出來了。按照這個順序,請求會傳過過濾器。
我們會把自己的權限的判斷的邏輯放在PermissionService里面。然后把PermissionService給到一個表達式處理器WebSecurityExpressionHandler。
表達式處理器給到我們的SecurityInterceptor
最終我們寫的表達式是交給WebSecurityExpressionHandler來處理,然后它又交給了PermissionService
PermissionService里面我們又寫了如果你沒有帶token,就是你當前是個匿名用戶 我就會拋出異常,如果你是個可以認出來的合法用戶,那么你有沒有權限,也會有個邏輯來判斷。如果你沒有權限,這里就會拋出相應的錯誤。就是Exception
拋出Exception會被ExceptionTranslationFilter捕獲住,捕獲住以后,會根據你拋出來的異常類型去調相應的處理器。在整個安全的里面一共就兩種異常,一種是401一種是403
41就交給了GatewayAuthenticationEntryPoint來處理。你的令牌有問題或者是你沒傳令牌。
另一種是你的身份認證過了,但是當前這個請求你沒權限,這是403交給GatewayAccessDeniedHandler來處理。
這兩個組件都是注到ExceptionTranslationFilter來進行相應的處理的
同時GatewayAuthenticationEntryPoint也會被注到 OAuth2ClientAuthenticationProcessingFilter。有種情況是你的令牌傳的不對,根本解析不了。
這就是jwt改造后在網關上做的所有事情。以及它的整個邏輯。
結束