摘要:鑒權(quán)項(xiàng)目是一個(gè)比較完整的使用了框架的開(kāi)源項(xiàng)目,可以用它來(lái)快速搭建分布式系統(tǒng)。本次著重看的部分是其服務(wù)以及用戶鑒權(quán)的部分。啟動(dòng)項(xiàng)目依次啟動(dòng),,,即可。服務(wù)端則負(fù)責(zé)生成,驗(yàn)證和更新。服務(wù)認(rèn)證由處理。的鑒權(quán)也是通過(guò)的。
鑒權(quán)
ACE項(xiàng)目是一個(gè)比較完整的使用了spring cloud框架的開(kāi)源項(xiàng)目,可以用它來(lái)快速搭建分布式系統(tǒng)。本次著重看的部分是其服務(wù)以及用戶鑒權(quán)的部分。ACE有一個(gè)鑒權(quán)服務(wù),負(fù)責(zé)微服務(wù)群的鑒權(quán)。啟動(dòng)ACE項(xiàng)目依次啟動(dòng)center,auth-server,admin,gateway即可。
模塊架構(gòu)鑒權(quán)模塊分為服務(wù)端和客戶端(另有一個(gè)common模塊,可忽略,是一些鑒權(quán)模塊公用代碼的提?。?。應(yīng)用程序依賴客戶端,客戶端提供了兩個(gè)攔截器,工具類(lèi),并和服務(wù)端通信的feign。服務(wù)端則負(fù)責(zé)token生成,驗(yàn)證和更新。
代碼分析 程序啟動(dòng)auth-server啟動(dòng)時(shí)初始化KeyConfiguration,獲得userSecret和serviceSecret.并在啟動(dòng)結(jié)束的鉤子類(lèi)AuthServerRunner中,分別設(shè)置User和Server的pri/puk.User用于用戶認(rèn)證,Server用于微服務(wù)認(rèn)證。
admin和gateway在啟動(dòng)的時(shí)候,會(huì)調(diào)用auth-client的自動(dòng)配置,生成ServiceAuthConfig和UserAuthConfig的實(shí)例。同時(shí)auth-client的AuthClientRunner會(huì)請(qǐng)求pubkey到ServiceAuthConfig和UserAuthConfig的實(shí)例。同時(shí)在應(yīng)用各自的WebConfiguration中添加UserAuthRestInterceptor和ServiceAuthRestInterceptor攔截器
運(yùn)行階段用戶認(rèn)證,由UserAuthRestInterceptor處理。
在用戶登錄的時(shí)候,調(diào)用jwtTokenUtil.generateToken生成token。這個(gè)token的生成規(guī)則稍后再論。在瀏覽器記錄一個(gè)Admin-Token.
--auth-server public String login(JwtAuthenticationRequest authenticationRequest) throws Exception { UserInfo info = userService.validate(authenticationRequest); if (!StringUtils.isEmpty(info.getId())) { return jwtTokenUtil.generateToken(new JWTInfo(info.getUsername(), info.getId() + "", info.getName())); } throw new UserInvalidException("用戶不存在或賬戶密碼錯(cuò)誤!"); }
登錄之后的請(qǐng)求都會(huì)經(jīng)過(guò)UserAuthRestInterceptor,在解析token的時(shí)候同時(shí)會(huì)進(jìn)行過(guò)期,簽名合法等驗(yàn)證。并把這些信息加到threadLocal中去。
--UserAuthRestInterceptor public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { ...... IJWTInfo infoFromToken = userAuthUtil.getInfoFromToken(token); BaseContextHandler.setUsername(infoFromToken.getUniqueName()); BaseContextHandler.setName(infoFromToken.getName()); BaseContextHandler.setUserID(infoFromToken.getId()); return super.preHandle(request, response, handler); } public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { BaseContextHandler.remove(); super.afterCompletion(request, response, handler, ex); }
服務(wù)認(rèn)證由ServiceAuthRestInterceptor處理。service的鑒權(quán)也是通過(guò)user的token。通過(guò)serviceAuthConfig.getTokenHeader()來(lái)解析service的信息。
--ServiceAuthRestInterceptor public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { ...... String token = request.getHeader(serviceAuthConfig.getTokenHeader()); IJWTInfo infoFromToken = serviceAuthUtil.getInfoFromToken(token); String uniqueName = infoFromToken.getUniqueName(); for(String client:serviceAuthUtil.getAllowedClient()){ if(client.equals(uniqueName)){ return super.preHandle(request, response, handler); } } throw new ClientForbiddenException("Client is Forbidden!"); }一些方法解讀(待補(bǔ)充)
jwtTokenUtil.generateToken:生成用戶token
userService.validate:驗(yàn)證用戶的合法性
userAuthUtil.getInfoFromToken(token):從token中獲得用戶名稱(chēng)和ID等信息。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/71736.html
摘要:的安全性不好,攻擊者可以通過(guò)獲取本地進(jìn)行欺騙或者利用進(jìn)行攻擊。 好久沒(méi)寫(xiě)博客了,因?yàn)樽罱疽笪覍W(xué)spring cloud ,早點(diǎn)將以前軟件遷移到新的架構(gòu)上。所以我那個(gè)拼命的學(xué)吶,總是圖快,很多關(guān)鍵的筆記沒(méi)有做好記錄,現(xiàn)在又遺忘了很多關(guān)鍵的技術(shù)點(diǎn),極其罪惡! 現(xiàn)在想一想,還是踏踏實(shí)實(shí)的走比較好。這不,今天我冒了個(gè)泡,來(lái)補(bǔ)一補(bǔ)前面我所學(xué)所忘的知識(shí)點(diǎn)。 想要解鎖更多新姿勢(shì)?請(qǐng)?jiān)L問(wèn)我的博客...
摘要:接下來(lái)繼續(xù)介紹三種架構(gòu)模式,分別是查詢分離模式微服務(wù)模式多級(jí)緩存模式。分布式應(yīng)用程序可以基于實(shí)現(xiàn)諸如數(shù)據(jù)發(fā)布訂閱負(fù)載均衡命名服務(wù)分布式協(xié)調(diào)通知集群管理選舉分布式鎖和分布式隊(duì)列等功能。 SpringCloud 分布式配置 SpringCloud 分布式配置 史上最簡(jiǎn)單的 SpringCloud 教程 | 第九篇: 服務(wù)鏈路追蹤 (Spring Cloud Sleuth) 史上最簡(jiǎn)單的 S...
摘要:框架具有輕便,開(kāi)源的優(yōu)點(diǎn),所以本譯見(jiàn)構(gòu)建用戶管理微服務(wù)五使用令牌和來(lái)實(shí)現(xiàn)身份驗(yàn)證往期譯見(jiàn)系列文章在賬號(hào)分享中持續(xù)連載,敬請(qǐng)查看在往期譯見(jiàn)系列的文章中,我們已經(jīng)建立了業(yè)務(wù)邏輯數(shù)據(jù)訪問(wèn)層和前端控制器但是忽略了對(duì)身份進(jìn)行驗(yàn)證。 重拾后端之Spring Boot(四):使用JWT和Spring Security保護(hù)REST API 重拾后端之Spring Boot(一):REST API的搭建...
摘要:認(rèn)證鑒權(quán)與權(quán)限控制在微服務(wù)架構(gòu)中的設(shè)計(jì)與實(shí)現(xiàn)一引言本文系認(rèn)證鑒權(quán)與權(quán)限控制在微服務(wù)架構(gòu)中的設(shè)計(jì)與實(shí)現(xiàn)系列的第一篇,本系列預(yù)計(jì)四篇文章講解微服務(wù)下的認(rèn)證鑒權(quán)與權(quán)限控制的實(shí)現(xiàn)。 java 開(kāi)源項(xiàng)目收集 平時(shí)收藏的 java 項(xiàng)目和工具 某小公司RESTful、共用接口、前后端分離、接口約定的實(shí)踐 隨著互聯(lián)網(wǎng)高速發(fā)展,公司對(duì)項(xiàng)目開(kāi)發(fā)周期不斷縮短,我們面對(duì)各種需求,使用原有對(duì)接方式,各端已經(jīng)很...
摘要:并向注冊(cè)中心注冊(cè),注冊(cè)地址為,最后將的所有端口暴露出來(lái),配置如下在工程的啟動(dòng)類(lèi)加上注解,開(kāi)啟的功能,加上注解開(kāi)啟的功能。在啟動(dòng)類(lèi)加上注解,開(kāi)啟的功能。 轉(zhuǎn)載請(qǐng)標(biāo)明出處: https://www.fangzhipeng.com本文出自方志朋的博客 Spring Boot Admin簡(jiǎn)介 Spring Boot Admin是一個(gè)開(kāi)源社區(qū)項(xiàng)目,用于管理和監(jiān)控SpringBoot應(yīng)用程序。 ...
閱讀 1316·2021-11-15 11:37
閱讀 3506·2021-11-11 16:55
閱讀 1758·2021-08-25 09:39
閱讀 3224·2019-08-30 15:44
閱讀 1739·2019-08-29 12:52
閱讀 1411·2019-08-29 11:10
閱讀 3245·2019-08-26 11:32
閱讀 3229·2019-08-26 10:16