日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
一個(gè)接口優(yōu)雅的實(shí)現(xiàn) Spring Cloud OAuth2 自定義token返回格式

本篇文章對應(yīng)視頻,介紹更加詳細(xì):

我們提供的服務(wù)有:網(wǎng)站制作、網(wǎng)站建設(shè)、微信公眾號開發(fā)、網(wǎng)站優(yōu)化、網(wǎng)站認(rèn)證、通州ssl等。為上千家企事業(yè)單位解決了網(wǎng)站和推廣的問題。提供周到的售前咨詢和貼心的售后服務(wù),是有科學(xué)管理、有技術(shù)的通州網(wǎng)站制作公司

問題描述

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
}

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

解決方案

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

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

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

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

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

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

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

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

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 {

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

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

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

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

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

上面是/oauth/token?的接口,/oauth/check_token?這個(gè)校驗(yàn)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)類型不支持的異常進(jìn)行處理
private OAuthServerWebResponseExceptionTranslator translate;

/**
* 重寫/oauth/check_token這個(gè)默認(rèn)接口,用于校驗(yàn)令牌,返回的數(shù)據(jù)格式統(tǒng)一
*/
@PostMapping(value = "/check_token")
public ResultMsg> checkToken(@RequestParam("token") String value) {
Map map = checkTokenEndpoint.checkToken(value);
return ResultMsg.resultSuccess(map);
}

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

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

總結(jié)

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


本文標(biāo)題:一個(gè)接口優(yōu)雅的實(shí)現(xiàn) Spring Cloud OAuth2 自定義token返回格式
轉(zhuǎn)載來源:http://m.5511xx.com/article/dpsdioi.html