但是,在springcloud中,每個微服務都直接公開restful接口。這時候各個微服務如何獲取當前的用戶信息?最好的辦法是代幣。token可以作為BS之間的會話標識(壹般是原生隨機token),也可以作為信息的載體傳遞壹些定制的信息(jwt,即Json web token)。
為了更清楚地理解這篇文章,我們需要對spring-security-oauth和jwt有所了解。本文只關註用戶信息的傳遞。
認證服務器配置授權服務器配置適配器
自定義令牌轉換器
CustomJwtAccessTokenConverter
此時以固定格式訪問授權服務器的令牌接口獲取令牌。如圖,可以獲得jwt格式的token,並添加了額外的信息nick_name。
以下信息,即用戶名和授權信息,可以通過直接解析jwt字符串獲得。
您只需要指定與授權服務器完全相同的令牌存儲和令牌轉換器。
在securiy的過濾器中,OAuth 2認證處理過濾器將從令牌中獲取相關信息進行認證。
源代碼:
請註意,資源服務器主要配置在
資源服務器配置適配器
微服務獲取jwttoken中的用戶信息。有兩種方法可以通過使用安全上下文直接獲得當前用戶名和權限,另壹種方法是定制攔截器以獲得附加信息。
這很簡單,獲取頭頭解析驗證令牌。
然後獲取之前從授權服務器添加的nick_name的額外信息,放入線程變量中。
其中用戶上下文類
啟動攔截器來註冊webmvc配置類。
在控制器中獲取用戶信息如下圖所示。
在默認的認證異常中如圖。
假設我們做全局異常處理,前端想在令牌過期時進行統壹登錄跳轉。怎麽做呢?
只需實現AuthenticationEntryPoint接口並覆蓋開始方法。
註意,直接拋出異常並不需要@RestControllerAdvice,因為這裏響應直接返回,並不由控制器處理。
此時,我返回我的定制響應對象,如圖所示。