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

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

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

最近讀者朋友針對(duì)Spring Security OAuth2.0 想要陳某補(bǔ)充一些知識(shí),如下:

今天這篇文章就來(lái)回答其中一個(gè)問(wèn)題:如何自定義token的返回格式?

問(wèn)題描述

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

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

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

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

那么如何去對(duì)默認(rèn)的格式進(jìn)行修改呢?

解決方案

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

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

第一種方案呢可以實(shí)現(xiàn),但是對(duì)于陳某來(lái)說(shuō)不夠優(yōu)雅,實(shí)現(xiàn)比較簡(jiǎn)單,不顯逼格

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

/oauth/token這個(gè)接口定義在哪里呢?通過(guò)源碼我們知道定義在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 {}

可以看到針對(duì)這個(gè)接口定義了兩個(gè),一個(gè)是GET請(qǐng)求、一個(gè)是POST請(qǐng)求

TokenEndpoint其實(shí)就是一個(gè)接口,使用注解@FrameworkEndpoint標(biāo)注,這個(gè)注解和@Controller的作用一樣,如下:

@FrameworkEndpoint
public class TokenEndpoint extends AbstractEndpoint {}

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

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

    //令牌請(qǐng)求的端點(diǎn)
    @Autowired
    private TokenEndpoint tokenEndpoint;

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

    /**
     * 重寫/oauth/token這個(gè)默認(rèn)接口,返回的數(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中的方法

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

上面是/oauth/token的接口,/oauth/check_token這個(gè)校驗(yàn)token的接口如需自定義也是可以的,對(duì)應(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;

    //自定義異常翻譯器,針對(duì)用戶名、密碼異常,授權(quán)類型不支持的異常進(jìn)行處理
    private OAuthServerWebResponseExceptionTranslator translate;
    
    /**
     * 重寫/oauth/check_token這個(gè)默認(rèn)接口,用于校驗(yàn)令牌,返回的數(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è)計(jì)思想,AOP的方式還要對(duì)參數(shù)解析,重新包裝

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

總結(jié)

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

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

相關(guān)文章

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

最新評(píng)論

临沭县| 安达市| 剑川县| 盐城市| 开化县| 婺源县| 灵山县| 仪陇县| 威海市| 嵊泗县| 丰原市| 吉木萨尔县| 淮滨县| 东乌珠穆沁旗| 榆树市| 类乌齐县| 疏附县| 潮州市| 五华县| 明水县| 文昌市| 合肥市| 汉源县| 浮山县| 平顶山市| 穆棱市| 华亭县| 台前县| 忻州市| 上思县| 昌平区| 深圳市| 中西区| 安平县| 南昌市| 英山县| 保定市| 湖口县| 胶南市| 清涧县| 碌曲县|