999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

基于Apache Shrio的微服務認證授權方案

2023-09-14 14:21:46遼河石油勘探局有限公司信息工程分公司林哲
數字技術與應用 2023年2期
關鍵詞:用戶服務信息

遼河石油勘探局有限公司信息工程分公司 林哲

信息化的高速發展推動了計算機應用架構的迭代演進,傳統單體應用項目的認證與授權方式已不適用于基于微服務架構的系統應用。本文提出了一種微服務架構下的認證授權方案,基于Apache Shrio整合Oauth2.0協議,實現獨立的微服務認證與授權中心;整合JWT作為認證令牌,增強系統的安全性、易用性。對于原有項目升級改造以及微服務應用構建開發均具備一定的參考價值。

隨著網絡技術的發展、應用規模的不斷擴大,以及應用場景的日趨復雜化,計算機應用架構也在不斷演變,逐漸從單體應用架構演化出了微服務架構等更加有利于資源匹配的架構形式。隨之產生的問題是單體架構中的認證授權機制不能直接應用到微服務架構中,需要重新設計一種認證授權方案,使其符合微服務無狀態、資源分散、技術多樣性等特點。Apache Shrio作為單體應用中的主流安全框架,是一個強大易用的Java安全框架,提供了認證、授權、加密和會話管理等功能,可以為任何應用提供安全保障[1]。Shiro提供的接口使其具有靈活的擴展能力,具備擴展為微服務架構安全框架的可能性。Oauth2.0協議的出現則為開發人員提供了一整套適用于微服務架構的認證授權開發標準。本文基于上述技術,研究了單體項目和微服務認證授權的機制,提出一種微服務架構下的認證與授權方案。

1 技術路線

1.1 微服務

微服務是一種軟件架構方案,通常由一組職責單一、具備自治性的獨立服務組成。服務之間由服務注冊、服務發現、網關、鏈路追蹤、熔斷機制等技術進行管理、維護。相較于單體項目,微服務架構具備以下優勢:

(1)彈性配置。微服務之間通過一些輕量級的通信機制進行通信,由于服務本身及網絡情況的不確定性,通信間的交互可能出現故障。由于微服務架構中的服務通常具備獨立職責且結構完整,而微服務應用程序的彈性也主要取決于微服務通信的可靠性。因此微服務提供了許多機制來保證微服務應用程序的彈性,其中包括超時、重試、斷路器、快速故障、隔板、事務、負載平衡,故障轉移和保證的交付等。(2)獨立擴展。在傳統單體項目中,對單一服務進行拓展時,由于系統間的服務耦合度高,導致系統整體也會受到影響。而微服務體系是由一組相對獨立的服務組成,可以指向性地針對特定服務進行單獨擴展,這樣就能根據實際需求合理分配資源到不同的服務中去,從而達到最佳的性能效果。(3)簡化部署。單體項目改版發布的難度隨其代碼規模的增長而增長,任何變動都需要整個項目重新部署。對于大體量項目來說,項目的重新部署以及處理可能產生的BUG都需要很高的成本,且具有很高的風險度。微服務由于互相之間相對獨立,單一微服務體量小易部署,即使產生BUG,也能夠快速回滾到之前的穩定版本進行部署,對當前運行的其他程序影響不大。

1.2 Apache Shiro

Apache Shiro是一種功能強大且易于使用的Java安全框架,它具有身份驗證、訪問授權、數據加密、會話管理等功能,可用于保護任何應用程序的安全[2]。Shiro主要由3個組件構成,分別為主體(Subject)、安全管理器(Security Manager)和領域(Realm)。

(1)主體。Subject是一個抽象概念,表示與程序交互的對象,是Shiro框架對外的核心對象。代表當前“用戶”,“用戶”一次不一定指的是人,也可以是其他應用程序、接口等。Subject作為對外接口,其中的交互操作實際都是由Security Manager來完成。(2)安全管理器。Security Manager是Shiro框架的核心組件。所有涉及系統安全的相關操作都會與Security Manager進行交互,Security Manager負責管理Shiro中的其他組件,協調各組件共同完成安全管理任務。(3)領域。Realm是安全信息數據源,內部封裝了通用數據源鏈接,用于作為安全驗證的參考數據。當進行授權、令牌獲取、令牌認證等操作時,Shiro通過配置的Realm查找相關的數據信息,Realm可以配置一個或多個。當Shrio默認提供的Realm無法滿足需求時,可以自定義領域實現,形成定制化數據源。

1.3 JWT

Json Web Token (JWT)是一個基于 RFC7519 的信息傳遞協議,是為了在網絡應用環境間傳遞聲明而執行的一種基于JSON的開放標準[3]。JWT是由點符號連接的3個部分組成,分別為標頭(Header)、載荷(Payload)和簽名(Signature),其中Header存儲了所使用的加密算法和Token類型;Payload是一個JSON對象,作為JWT的主體部分,官方規定了7個字段供開發者選用,也可以自定義字段和內容;Signature是對前2個部分的簽名,作用是防止數據篡改。這3個部分分別單獨進行Base64編碼后使用點符號拼接成完整的JWT。相比傳統的Session認證方式,基于Token的認證方式更適用于移動端和分布式,且更節約計算資源,具備支持跨域訪問、無狀態、適用于CDN、無需考慮CSRF等特性。

1.4 Oauth2.0

OAuth2.0是一個授權第三方服務訪問Web項目的安全協議。OAuth2.0將第三方應用與用戶的安全信息進行分隔,并且提供簡單、標準的實現方案來訪問應用中受保護的資源。該協議具備開放、靈活、簡單、安全等特點。OAuth2.0采用無狀態的認證授權方式,以令牌作為安全信息的載體,適用于多服務獨立部署的微服務架構。令牌基于Rest風格的API在服務間進行傳遞。

1.5 Apache Oltu

Apache Oltu是OAuth2.0協議基于Java語言的實現,具有輕量、簡單、靈活等特點。Apache Oltu源碼包分為4個部分:

(1)Issuer:生成授權碼和訪問令牌,刷新令牌;(2)Request:封裝授權碼請求和令牌請求的邏輯,并提供相應的校驗服務;(3)Response:封裝授權流程中的響應邏輯,提供生成不同響應結果的方法;(4)Validator:為Request提供校驗服務。

2 方案設計

(1)微服務入口處理。微服務架構通常由API網關作為系統對外的唯一入口。因此網關可以整合令牌的初步認證。通過獲取請求中的令牌信息,并對信息進行解析、校驗等操作,實現身份認證以及部分授權功能。另外,網關需要設置白名單,即驗證碼、令牌獲取等請求不需要進行身份認證即可訪問。(2)獲取授權碼。當外部應用對服務發起授權碼請求時,網關通過判斷請求在白名單列表中,直接將請求轉發至認證中心。認證中心對用戶名密碼進行驗證,驗證通過后生成授權碼,并以重定向URL參數的形式返回給用戶。(3)令牌的選擇及獲取。方案采取無狀態認證授權方式,使用Token作為安全信息載體。為提高令牌的安全性、易用性、靈活性,采用JWT作為令牌實現。經由網關白名單釋放的令牌獲取請求到達認證中心。認證中心對請求中攜帶的授權碼驗證,驗證通過后生成驗證碼。(4)資源授權。當請求攜帶有效Token訪問服務時,網關通過對Token的解析,獲取身份信息及權限信息。并將信息重新加密后通過請求傳遞給資源中心,資源中心解密信息后,將信息存入安全上下文。資源中心根據上下文中的權限信息對請求進行授權并獲取資源,最終完成請求訪問流程。

3 功能實現

3.1 網關整合令牌認證

通過實現Spring Cloud Gateway的GlobalFilter實現對網關訪問請求的攔截,從中獲取令牌,并使用JWTStore進行解析,獲取權限信息及身份信息并進行身份認證。認證通過后,將安全信息編碼后添加到請求,通過Filter Chain向后傳遞。

public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {

String requestUrl = exchange.getRequest().getPath().value();

AntPathMatcher pathMatcher = new AntPath Matcher();

//1 認證中心服務所有放行

if (pathMatcher.match("/sso-server/**",requestUrl)) {

return chain.filter(exchange);

}

//2 檢查token是否存在

String token = getToken(exchange);

if (!StringUtils.hasLength(token)) {

return noTokenMono(exchange);

}

//3 判斷是否是有效的token

OAuth2AccessToken oAuth2AccessToken;

try {

oAuth2AccessToken = tokenStore.readAccess Token(token);

Map<String, Object> additionalInformation =oAuth2AccessToken.getAdditionalInformation();

//取出用戶身份信息

String principal = (String)additionalInformation.get("user_name");

//獲取用戶權限

List<String> authorities = (List<String>)additionalInformation.get("authorities");

HashMap hashMap = new HashMap();

hashMap.put("principal",principal);

hashMap.put("authorities",authorities);

//給header添加值

String base64 = "";

try {

base64 = EncryptUtil.encodeUTF8StringBase64(new ObjectMapper().writeValueAsString(hashMap));

} catch (IOException e) {

e.printStackTrace();

}

ServerHttpRequest tokenRequest = exchange.get Request().mutate().header("json-token", base64).build();

ServerWebExchange build = exchange.mutate().request(tokenRequest).build();

return chain.filter(build);

} catch (InvalidTokenException e) {

return invalidTokenMono(exchange);

}

}

3.2 獲取授權碼

授權碼獲取采用Shiro整合Oltu實現。通過Subject狀態判斷用戶是否已登錄,如果通過狀態判定,則生成授權碼,并以重定向方式將授權碼返回給客戶端。

//封裝OAth請求

OAuthAuthzRequest authzRequest=new OAuth AuthzRequest(request);

//檢查client_id

if(!checkClientId(authzRequest.getClientId())){

//錯誤則構造錯誤響應

return "error";

}

//判斷用戶登錄狀態

Subject subject=SecurityUtils.getSubject();

if(!subject.isAuthenticated())

return "oauth2login";

}

//判斷狀態為登錄成功,則生成授權碼code

String username=(String)subject.getPrincipal();

String authorizCode=null;

String responseType= authzRequest

.getParam("response_type");

if(responseType.equals("code")){

//生成authCode

OAuthIssuerImpl issuerImpl=new OAuthIssuerImpl(

new MD5Generator());

authorizCode= issuerImpl.authorizationCode();

addAuthCode(authorizCode,username);

}

//重定向回客戶端地址

String redURI=authzRequest

.getParam("redirectUrl");

final OAuthResponse response= OAuthASResponse

.authorizationResponse(request,302)

.setCode(authorizCode)

.location(redURI)

.buildQueryMessage();

HttpHeaders hs=new HttpHeaders();

URI uri = new URI(response.getLocationUri());

hs.setLocation(uri);

return new ResponseEntity(hs, HttpStatus.FOUND);

3.3 獲取令牌

Shiro的領域接口提供了Supports方法,用于設置Realm支持的Token類型。重寫Supports方法,指定Token驗證類型為封裝的JWT類型,為整合JWT做準備。通過對自定義Realm中的認證方法進行重寫,增加令牌認證功能。

public class JwtShiroRealm extends AuthorizingRealm{

@Override

public boolean supports(AuthenticationToken token) {

return token instanceof JwtToken;

}

// 認證

@Override

protected AuthenticationInfo doGetAuthenticationInfo(Au thenticationToken token) throws AuthenticationException {

String credentials = (String) token.getCredentials();

// 解密獲得username,用于和數據庫進行對比

String username = JwtUtil.getUsername(credentials);

if ("admin".equals(username)) {

//數據庫查出來的用戶

User user = getUser();

//驗證密碼是否正確

if (JwtUtil.verify(tokenStr, username, user.get Password())) {

log.info("登錄成功");

} else {

throw new UnknownAccountException("用戶名密碼錯誤");

}

SimpleAuthenticationInfo simpleAuthenticationInfo= new SimpleAuthenticationInfo(token.getCredentials(),token.getCredentials(), this.getName());

return simpleAuthenticationInfo;

}

return null;

}

}

3.4 整合JWT實現

自定義JWT工具類,實現生成令牌、令牌驗證、獲取對應信息等相關功能。

public class JwtUtil {

private static final long EXPIRE_TIME = 60 *60 * 1000;

//校驗token

public static boolean check(String token, String name, String secret) {

try {

//根據秘鑰生成JWT效驗器

Algorithm alg = Algorithm.HMAC256(secret);

JWTVerifier verif = JWT.require(alg)

.withClaim("username", name)

.build();

//校驗token

DecodedJWT dcjwt = verif.verify(token);

return true;

} catch (Exception e) {

return false;

}

}

//獲取用戶名

public static String getUsername(String token) {

try {

DecodedJWT jwt = JWT.decode(token);

return jwt.getClaim("username").asString();

} catch (JWTDecodeException e) {

return null;

}

}

//生成token

public static String sign(String uname, String secret) {

return JWT.create()

.withJWTId(UUID.randomUUID().toString())

.withClaim("username", uname)

.withExpiresAt(new Date(getCurrentDate()))

.sign(Algorithm.HMAC256(secret));

}

}

4 結語

本文通過對Apache Shiro、JWT、微服務架構等技術的介紹與分析,提出了一種基于Apache Shiro的微服務認證授權方案。方案在保留Shiro原有特性的前提下,實現了對微服務架構的適配,具有高效率、高安全性、低耦合度、可擴展等特點。方案所實現的安全框架能夠完成認證授權在微服務架構中的完全覆蓋,同時也保留了一定的靈活性,讀者可以根據實際情況調整安全框架的有效范圍,從而找到應用整體的最佳運行效果。

引用

[1]時子慶,劉金蘭,譚曉華.基于OAuth2.0的認證授權技術[J].計算機系統應用,2012,21(3):260-264.

[2]梁清華,胡安明.Apache Shiro框架在Web系統的安全應用研究[J].電腦知識與技術,2021,17(6):52-53.

[3]范展源,羅福強.JWT認證技術及其在WEB中的應用[J].數字技術與應用,2016(2):114.

猜你喜歡
用戶服務信息
服務在身邊 健康每一天
今日農業(2019年12期)2019-08-15 00:56:32
服務在身邊 健康每一天
今日農業(2019年10期)2019-01-04 04:28:15
服務在身邊 健康每一天
今日農業(2019年16期)2019-01-03 11:39:20
招行30年:從“滿意服務”到“感動服務”
商周刊(2017年9期)2017-08-22 02:57:56
訂閱信息
中華手工(2017年2期)2017-06-06 23:00:31
關注用戶
商用汽車(2016年11期)2016-12-19 01:20:16
關注用戶
商用汽車(2016年6期)2016-06-29 09:18:54
關注用戶
商用汽車(2016年4期)2016-05-09 01:23:12
如何獲取一億海外用戶
創業家(2015年5期)2015-02-27 07:53:25
展會信息
中外會展(2014年4期)2014-11-27 07:46:46
主站蜘蛛池模板: 国产国模一区二区三区四区| 亚洲精品色AV无码看| 99热这里都是国产精品| 亚洲无码视频喷水| 欧美激情,国产精品| 亚洲成av人无码综合在线观看| 69免费在线视频| 亚洲色图欧美| 亚洲无限乱码一二三四区| 大学生久久香蕉国产线观看| 亚洲精品天堂自在久久77| 欧美一级高清片久久99| 日本免费高清一区| 国产成人一区| 人妻丰满熟妇av五码区| 欧美综合区自拍亚洲综合天堂| 国产精品网曝门免费视频| 亚洲欧美人成人让影院| 国产亚洲精品精品精品| 亚洲水蜜桃久久综合网站| 亚洲精品自拍区在线观看| 伊人蕉久影院| 色偷偷av男人的天堂不卡| 亚洲中文字幕无码爆乳| 国产91透明丝袜美腿在线| 高清免费毛片| 久久国产高清视频| 在线观看国产精品一区| 国产在线观看99| 看看一级毛片| 亚洲日韩精品无码专区97| 国产日本一线在线观看免费| 福利小视频在线播放| 亚洲中文字幕日产无码2021| 亚洲天堂久久新| 成年片色大黄全免费网站久久| 国产丰满成熟女性性满足视频| 久久久黄色片| 九一九色国产| 亚洲AV电影不卡在线观看| 喷潮白浆直流在线播放| 在线播放国产一区| 国产网站免费| 国产尤物在线播放| 日韩黄色大片免费看| 免费A级毛片无码免费视频| 99久久精品国产自免费| 99热这里只有免费国产精品| 五月激情婷婷综合| 成人小视频网| 黄片一区二区三区| 欧美综合在线观看| 日韩不卡高清视频| 婷婷六月天激情| 伊人无码视屏| 日韩性网站| www亚洲精品| 国产精品第一区在线观看| 日韩AV无码一区| 在线免费不卡视频| 欧美日韩在线亚洲国产人| 色偷偷av男人的天堂不卡| 国产91丝袜在线播放动漫 | 三上悠亚在线精品二区| 日韩在线1| 国产日韩欧美精品区性色| 男人天堂伊人网| 国产国产人在线成免费视频狼人色| 青青国产视频| 成人a免费α片在线视频网站| 亚洲天堂.com| 国产午夜福利在线小视频| 波多野结衣久久高清免费| 91久久偷偷做嫩草影院免费看| 国产精品欧美亚洲韩国日本不卡| 男人天堂亚洲天堂| 国产理论最新国产精品视频| 色亚洲成人| 国产精品视频公开费视频| 老司国产精品视频91| 欧美a网站| 欧美日韩第三页|