最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Spring?Cloud?OAuth2實現(xiàn)自定義token返回格式

 更新時間:2022年06月24日 14:04:51   作者:碼猿技術(shù)專欄  
Spring?Security?OAuth的token返回格式都是默認的,但是往往這個格式是不適配系統(tǒng)。本文將用一個接口優(yōu)雅的實現(xiàn)?Spring?Cloud?OAuth2?自定義token返回格式,需要的可以參考一下

最近讀者朋友針對Spring Security OAuth2.0 想要陳某補充一些知識,如下:

今天這篇文章就來回答其中一個問題:如何自定義token的返回格式?

問題描述

Spring Security OAuth的token返回格式都是默認的,但是往往這個格式是不適配系統(tǒng),/oauth/token返回的格式如下:

{
    "access_token": token
    "token_type": "bearer",
    "refresh_token": xxxx
    "expires_in": xxx,
    "scope": "xxx",
    "jti": xxxx
    ....................
}

然而此時系統(tǒng)中的統(tǒng)一返回格式為:

{
    "code":xxx
    "data":xxx
    "msg":xxx
}

那么如何去對默認的格式進行修改呢?

解決方案

其實解決方案還是很多的,據(jù)陳某了解有如下兩種解決方案:

  • 使用AOP的方式對/oauth/token這個接口的結(jié)果攔截修改
  • 重定義接口覆蓋默認的

第一種方案呢可以實現(xiàn),但是對于陳某來說不夠優(yōu)雅,實現(xiàn)比較簡單,不顯逼格

于是陳某今天介紹第二種方案,一種比較優(yōu)雅的方式;想要理解第二種方式必須對Spring Security的底層源碼有一些了解。

/oauth/token這個接口定義在哪里呢?通過源碼我們知道定義在org.springframework.security.oauth2.provider.endpoint.TokenEndpoint中,如下:

@RequestMapping(value = "/oauth/token", method=RequestMethod.GET)
public ResponseEntity<OAuth2AccessToken> getAccessToken(Principal principal, @RequestParam
Map<String, String> parameters) throws HttpRequestMethodNotSupportedException {}

@RequestMapping(value = "/oauth/token", method=RequestMethod.POST)
public ResponseEntity<OAuth2AccessToken> postAccessToken(Principal principal, @RequestParam
Map<String, String> parameters) throws HttpRequestMethodNotSupportedException {}

可以看到針對這個接口定義了兩個,一個是GET請求、一個是POST請求

TokenEndpoint其實就是一個接口,使用注解@FrameworkEndpoint標注,這個注解和@Controller的作用一樣,如下:

@FrameworkEndpoint
public class TokenEndpoint extends AbstractEndpoint {}

那么知道在哪里定義的就好辦了,模仿著它這個接口自己重新定義一個覆蓋掉不就好了,如下:

@Api(value = "OAuth接口")
@RestController
@RequestMapping("/oauth")
@Slf4j
public class AuthController implements InitializingBean {

    //令牌請求的端點
    @Autowired
    private TokenEndpoint tokenEndpoint;

    //自定義異常翻譯器,針對用戶名、密碼異常,授權(quán)類型不支持的異常進行處理
    private OAuthServerWebResponseExceptionTranslator translate;

    /**
     * 重寫/oauth/token這個默認接口,返回的數(shù)據(jù)格式統(tǒng)一
     */
    @PostMapping(value = "/token")
    public ResultMsg<OAuth2AccessToken> postAccessToken(Principal principal, @RequestParam
            Map<String, String> parameters) throws HttpRequestMethodNotSupportedException {
        OAuth2AccessToken accessToken = tokenEndpoint.postAccessToken(principal, parameters).getBody();
        return ResultMsg.resultSuccess(accessToken);
    }
}

可以看到接口內(nèi)部不需要自己重寫邏輯,只需要調(diào)用TokenEndpoint中的方法

注意:由于對TokenEndpoint中的端點重寫了,因此前面定義的對用戶名、密碼之類的異常捕獲的翻譯類(OAuthServerWebResponseExceptionTranslator)將會失效,需要在全局異常中進行捕獲

上面是/oauth/token的接口,/oauth/check_token這個校驗token的接口如需自定義也是可以的,對應(yīng)的類是org.springframework.security.oauth2.provider.endpoint.CheckTokenEndpoint

重寫后代碼如下:

@Api(value = "OAuth接口")
@RestController
@RequestMapping("/oauth")
@Slf4j
public class AuthController implements InitializingBean {

    @Autowired
    private CheckTokenEndpoint checkTokenEndpoint;

    //自定義異常翻譯器,針對用戶名、密碼異常,授權(quán)類型不支持的異常進行處理
    private OAuthServerWebResponseExceptionTranslator translate;
    
    /**
     * 重寫/oauth/check_token這個默認接口,用于校驗令牌,返回的數(shù)據(jù)格式統(tǒng)一
     */
    @PostMapping(value = "/check_token")
    public ResultMsg<Map<String,?>> checkToken(@RequestParam("token") String value)  {
        Map<String, ?> map = checkTokenEndpoint.checkToken(value);
        return ResultMsg.resultSuccess(map);
    }

這種方式是不是很優(yōu)雅?也很符合Spring Security的設(shè)計思想,AOP的方式還要對參數(shù)解析,重新包裝

好了,關(guān)于測試的話自己搞一搞

總結(jié)

本篇文章介紹了認證服務(wù)中對token的返回格式自定義,總的來說還是比較簡單的,有興趣的也可以去網(wǎng)上找找關(guān)于AOP的方式。

以上就是Spring Cloud OAuth2實現(xiàn)自定義token返回格式的詳細內(nèi)容,更多關(guān)于Spring Cloud OAuth2的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • SpringBoot整合Canal與RabbitMQ監(jiān)聽數(shù)據(jù)變更記錄

    SpringBoot整合Canal與RabbitMQ監(jiān)聽數(shù)據(jù)變更記錄

    這篇文章主要介紹了SpringBoot整合Canal與RabbitMQ監(jiān)聽數(shù)據(jù)變更記錄,文章圍繞主題展開詳細的內(nèi)容介紹,具有一定的參考價值,需要的小伙伴可以參考一下
    2022-09-09
  • Java中final變量使用總結(jié)

    Java中final變量使用總結(jié)

    這篇文章主要介紹了Java中final變量使用總結(jié),final關(guān)鍵字可用于變量聲明,一旦該變量被設(shè)定,就不可以再改變該變量的值,通常final定義的變量為常量,需要的朋友可以參考下
    2015-06-06
  • IDEA中Maven的一些常用操作指南

    IDEA中Maven的一些常用操作指南

    intellij idea是一款很流行好用的集成開發(fā)環(huán)境軟件,maven是使用很廣泛的構(gòu)建工具,java開發(fā)者日常少不了與這兩種工具打交道,下面這篇文章主要給大家介紹了關(guān)于IDEA中Maven的一些常用操作指南,需要的朋友可以參考下
    2024-06-06
  • 使用Java填充Word模板的方法詳解

    使用Java填充Word模板的方法詳解

    Java填充Word模板是一種將動態(tài)數(shù)據(jù)插入到Word文檔模板中生成最終文檔的過程,通常用于批量創(chuàng)建包含個人信息、報告結(jié)果或其他動態(tài)內(nèi)容的文檔,本文給大家介紹了使用Java填充Word模板的方法,需要的朋友可以參考下
    2024-07-07
  • Struts2修改上傳文件大小限制方法解析

    Struts2修改上傳文件大小限制方法解析

    這篇文章主要介紹了Struts2修改上傳文件大小限制的相關(guān)內(nèi)容,包括決定Struts2上傳文件大小的因素,具有一定參考價值,需要的朋友可以了解下。
    2017-09-09
  • 解決ObjectMapper.convertValue() 遇到的一些問題

    解決ObjectMapper.convertValue() 遇到的一些問題

    這篇文章主要介紹了解決ObjectMapper.convertValue() 遇到的一些問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-06-06
  • JDK14新特性之switch表達式的實現(xiàn)

    JDK14新特性之switch表達式的實現(xiàn)

    這篇文章主要介紹了JDK14新特性之switch表達式的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-05-05
  • Java中List根據(jù)map的某個key去重的代碼

    Java中List根據(jù)map的某個key去重的代碼

    今天小編就為大家分享一篇關(guān)于Java中List根據(jù)map的某個key去重的代碼,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2018-12-12
  • springboot整合rabbitmq實現(xiàn)訂單超時取消案例分析

    springboot整合rabbitmq實現(xiàn)訂單超時取消案例分析

    本文介紹了如何使用SpringBoot和RabbitMQ實現(xiàn)訂單超時取消功能,通過配置TTL隊列和死信交換機,可以管理訂單的超時邏輯,實際應(yīng)用中,可以通過數(shù)據(jù)庫標記訂單狀態(tài)或手動確認機制來防止訂單被錯誤取消
    2025-01-01
  • java拷貝指定目錄下所有內(nèi)容到minIO代碼實例

    java拷貝指定目錄下所有內(nèi)容到minIO代碼實例

    這篇文章主要介紹了java拷貝指定目錄下所有內(nèi)容到minIO代碼實例,創(chuàng)建桶 直接使用工具類先判斷,再創(chuàng)建即可,創(chuàng)建文件夾,需要注意以"/"結(jié)尾,實際也是在minIO上創(chuàng)建文件,只是作為目錄的表現(xiàn)形式展示,需要的朋友可以參考下
    2024-01-01

最新評論

桐乡市| 普兰店市| 南宫市| 义乌市| 托克逊县| 旺苍县| 平谷区| 讷河市| 德州市| 灵武市| 乐东| 哈巴河县| 邳州市| 金门县| 沙洋县| 广昌县| 民权县| 新巴尔虎右旗| 西畴县| 宝鸡市| 宾川县| 田阳县| 德庆县| 陆丰市| 辽阳市| 广西| 定兴县| 靖远县| 海口市| 同江市| 萨迦县| 监利县| 锡林郭勒盟| 鄂托克旗| 漾濞| 连平县| 龙胜| 莒南县| 西乡县| 武城县| 水城县|