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

Spring Security OAuth 個(gè)性化token的使用

 更新時(shí)間:2019年02月18日 14:19:58   作者:冷冷  
這篇文章主要介紹了Spring Security OAuth 個(gè)性化token的使用,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧

個(gè)性化Token 目的

默認(rèn)通過(guò)調(diào)用 /oauth/token 返回的報(bào)文格式包含以下參數(shù)

{
 "access_token": "e6669cdf-b6cd-43fe-af5c-f91a65041382",
 "token_type": "bearer",
 "refresh_token": "da91294d-446c-4a89-bdcf-88aee15a75e8",
 "expires_in": 43199, 
 "scope": "server"
}

并沒(méi)包含用戶(hù)的業(yè)務(wù)信息比如用戶(hù)信息、租戶(hù)信息等。

擴(kuò)展生成包含業(yè)務(wù)信息(如下),避免系統(tǒng)多次調(diào)用,直接可以通過(guò)認(rèn)證接口獲取到用戶(hù)信息等,大大提高系統(tǒng)性能

{
 "access_token":"a6f3b6d6-93e6-4eb8-a97d-3ae72240a7b0",
 "token_type":"bearer",
 "refresh_token":"710ab162-a482-41cd-8bad-26456af38e4f",
 "expires_in":42396,
 "scope":"server",
 "tenant_id":1,
 "license":"made by pigx",
 "dept_id":1,
 "user_id":1,
 "username":"admin"
}

密碼模式生成Token 源碼解析

​ 主頁(yè)參考紅框部分

ResourceOwnerPasswordTokenGranter (密碼模式)根據(jù)用戶(hù)的請(qǐng)求信息,進(jìn)行認(rèn)證得到當(dāng)前用戶(hù)上下文信息

protected OAuth2Authentication getOAuth2Authentication(ClientDetails client, TokenRequest tokenRequest) {
 Map<String, String> parameters = new LinkedHashMap<String, String>(tokenRequest.getRequestParameters());
 String username = parameters.get("username");
 String password = parameters.get("password");
 // Protect from downstream leaks of password
 parameters.remove("password");
 Authentication userAuth = new UsernamePasswordAuthenticationToken(username, password);
 ((AbstractAuthenticationToken) userAuth).setDetails(parameters);
  
 userAuth = authenticationManager.authenticate(userAuth);

 OAuth2Request storedOAuth2Request = getRequestFactory().createOAuth2Request(client, tokenRequest);  
  return new OAuth2Authentication(storedOAuth2Request, userAuth);
}

然后調(diào)用AbstractTokenGranter.getAccessToken() 獲取OAuth2AccessToken

protected OAuth2AccessToken getAccessToken(ClientDetails client, TokenRequest tokenRequest) {
 return tokenServices.createAccessToken(getOAuth2Authentication(client, tokenRequest));
}

默認(rèn)使用DefaultTokenServices來(lái)獲取token

public OAuth2AccessToken createAccessToken(OAuth2Authentication authentication) throws AuthenticationException {

 ... 一系列判斷 ,合法性、是否過(guò)期等判斷 
 OAuth2AccessToken accessToken = createAccessToken(authentication, refreshToken);
  tokenStore.storeAccessToken(accessToken, authentication);
  // In case it was modified
  refreshToken = accessToken.getRefreshToken();
  if (refreshToken != null) {
   tokenStore.storeRefreshToken(refreshToken, authentication);
  }
  return accessToken;
}

createAccessToken 核心邏輯

// 默認(rèn)刷新token 的有效期
private int refreshTokenValiditySeconds = 60 * 60 * 24 * 30; // default 30 days.
// 默認(rèn)token 的有效期
private int accessTokenValiditySeconds = 60 * 60 * 12; // default 12 hours.

private OAuth2AccessToken createAccessToken(OAuth2Authentication authentication, OAuth2RefreshToken refreshToken) {
 DefaultOAuth2AccessToken token = new DefaultOAuth2AccessToken(uuid);
 token.setExpiration(Date)
 token.setRefreshToken(refreshToken);
 token.setScope(authentication.getOAuth2Request().getScope());
 return accessTokenEnhancer != null ? accessTokenEnhancer.enhance(token, authentication) : token;
}

如上代碼,在拼裝好token對(duì)象后會(huì)調(diào)用認(rèn)證服務(wù)器配置TokenEnhancer( 增強(qiáng)器) 來(lái)對(duì)默認(rèn)的token進(jìn)行增強(qiáng)。

TokenEnhancer.enhance 通過(guò)上下文中的用戶(hù)信息來(lái)個(gè)性化Token

public OAuth2AccessToken enhance(OAuth2AccessToken accessToken, OAuth2Authentication authentication) {
 final Map<String, Object> additionalInfo = new HashMap<>(8);
 PigxUser pigxUser = (PigxUser) authentication.getUserAuthentication().getPrincipal();
 additionalInfo.put("user_id", pigxUser.getId());
 additionalInfo.put("username", pigxUser.getUsername());
 additionalInfo.put("dept_id", pigxUser.getDeptId());
 additionalInfo.put("tenant_id", pigxUser.getTenantId());
 additionalInfo.put("license", SecurityConstants.PIGX_LICENSE);
 ((DefaultOAuth2AccessToken) accessToken).setAdditionalInformation(additionalInfo);
 return accessToken;
}

基于pig 看下最終的實(shí)現(xiàn)效果

Pig 基于Spring Cloud、oAuth2.0開(kāi)發(fā)基于Vue前后分離的開(kāi)發(fā)平臺(tái),支持賬號(hào)、短信、SSO等多種登錄,提供配套視頻開(kāi)發(fā)教程。

https://gitee.com/log4j/pig

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • java子線(xiàn)程解決獲取主線(xiàn)程的request對(duì)象問(wèn)題

    java子線(xiàn)程解決獲取主線(xiàn)程的request對(duì)象問(wèn)題

    這篇文章主要介紹了java子線(xiàn)程解決獲取主線(xiàn)程的request對(duì)象問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-08-08
  • Java使用JXLS導(dǎo)出Excel詳解

    Java使用JXLS導(dǎo)出Excel詳解

    jxls是一個(gè)輕量級(jí)的Java庫(kù),用于基于模板的Excel報(bào)表生成,這篇文章主要為大家介紹了Java如何使用JXLS導(dǎo)出Excel,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-11-11
  • Java通過(guò)Scanner了解if...else if語(yǔ)句

    Java通過(guò)Scanner了解if...else if語(yǔ)句

    這篇文章主要介紹了Java通過(guò)Scanner了解if...else if語(yǔ)句,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-01-01
  • SpringBoot中使用Filter和Interceptor的示例代碼

    SpringBoot中使用Filter和Interceptor的示例代碼

    這篇文章主要介紹了SpringBoot中使用Filter和Interceptor的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-06-06
  • Spring Boot集成MyBatis-Plus 自定義攔截器實(shí)現(xiàn)動(dòng)態(tài)表名切換功能

    Spring Boot集成MyBatis-Plus 自定義攔截器實(shí)現(xiàn)動(dòng)態(tài)表名切換功能

    本文介紹了如何在SpringBoot項(xiàng)目中集成MyBatis-Plus,并通過(guò)自定義攔截器實(shí)現(xiàn)動(dòng)態(tài)表名切換,此外,還探討了MyBatis攔截器在其他場(chǎng)景中的應(yīng)用,如SQL日志記錄、多租戶(hù)數(shù)據(jù)隔離、數(shù)據(jù)權(quán)限控制等,感興趣的朋友跟隨小編一起看看吧
    2024-11-11
  • Java gRPC攔截器簡(jiǎn)單實(shí)現(xiàn)分布式日志鏈路追蹤器過(guò)程詳解

    Java gRPC攔截器簡(jiǎn)單實(shí)現(xiàn)分布式日志鏈路追蹤器過(guò)程詳解

    有請(qǐng)求的發(fā)送、處理,當(dāng)然就會(huì)有攔截器的需求,例如在服務(wù)端通過(guò)攔截器統(tǒng)一進(jìn)行請(qǐng)求認(rèn)證等操作,這些就需要攔截器來(lái)完成,今天松哥先和小伙伴們來(lái)聊一聊gRPC中攔截器的基本用法,后面我再整一篇文章和小伙伴們做一個(gè)基于攔截器實(shí)現(xiàn)的JWT認(rèn)證的gRPC
    2023-03-03
  • IDEA 重新導(dǎo)入依賴(lài)maven 命令 reimport的方法

    IDEA 重新導(dǎo)入依賴(lài)maven 命令 reimport的方法

    這篇文章主要介紹了IDEA 重新導(dǎo)入依賴(lài)maven 命令 reimport的相關(guān)知識(shí),本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-04-04
  • 詳解多線(xiàn)程及Runable 和Thread的區(qū)別

    詳解多線(xiàn)程及Runable 和Thread的區(qū)別

    這篇文章主要介紹了多線(xiàn)程及Runable 和Thread的區(qū)別,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04
  • SpringBoot中配置文件及切換方式

    SpringBoot中配置文件及切換方式

    這篇文章主要介紹了SpringBoot中配置文件及切換方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-05-05
  • SpringMVC源碼解讀之HandlerMapping - AbstractUrlHandlerMapping系列request分發(fā)

    SpringMVC源碼解讀之HandlerMapping - AbstractUrlHandlerMapping系列re

    這篇文章主要介紹了SpringMVC源碼解讀之HandlerMapping - AbstractUrlHandlerMapping系列request分發(fā) 的相關(guān)資料,需要的朋友可以參考下
    2016-02-02

最新評(píng)論

库尔勒市| 凌源市| 泰和县| 鄄城县| 定远县| 称多县| 连南| 阆中市| 昌吉市| 顺昌县| 汉沽区| 江陵县| 保定市| 江口县| 普定县| 封开县| 深泽县| 章丘市| 毕节市| 揭东县| 太谷县| 呼玛县| 玉溪市| 闻喜县| 赞皇县| 双流县| 海口市| 平乐县| 武功县| 富平县| 桑植县| 云林县| 巴马| 商水县| 河西区| 巴塘县| 灵石县| 东方市| 乌审旗| 巴马| 夏邑县|