av激情亚洲男人的天堂国语,日韩欧美精品一中文字幕,无码av一区二区三区无码,国产又色又爽又刺激的a片,国产又色又爽又刺激的a片

一個(gè)接口優(yōu)雅的實(shí)現(xiàn) Spring Cloud OAuth2 自定義token返回格式

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

我們提供的服務(wù)有:網(wǎng)站制作、網(wǎng)站建設(shè)、微信公眾號(hào)開發(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
}

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

解決方案

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

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

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

于是陳某今天介紹第二種方案,一種比較優(yōu)雅的方式;想要理解第二種方式必須對(duì)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 {}

可以看到針對(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 postAccessToken(Principal principal, @RequestParam
Map 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> checkToken(@RequestParam("token") String value) {
Map 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的返回格式自定義,總的來說還是比較簡(jiǎn)單的,有興趣的也可以去網(wǎng)上找找關(guān)于AOP的方式。


標(biāo)題名稱:一個(gè)接口優(yōu)雅的實(shí)現(xiàn) Spring Cloud OAuth2 自定義token返回格式
文章轉(zhuǎn)載:http://uogjgqi.cn/article/dpsdioi.html
掃二維碼與項(xiàng)目經(jīng)理溝通

我們?cè)谖⑿派?4小時(shí)期待你的聲音

解答本文疑問/技術(shù)咨詢/運(yùn)營(yíng)咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流