日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

SpringCloud鉴权

發布時間:2024/3/24 javascript 53 豆豆
生活随笔 收集整理的這篇文章主要介紹了 SpringCloud鉴权 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1.JWT

1.0 為什么要學習JWT?

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-2Ok258P2-1637241962605)(assets/1544169629935.png)]

1.1.簡介

JWT,全稱是Json Web Token, 是JSON風格輕量級的授權和身份認證規范,可實現無狀態、分布式的Web應用授權;它是分布式服務權限控制的標準解決方案!

它跟RBAC的區別:兩者不沖突,在項目中后臺權限服務的數據庫設計使用RBAC,而前端項目訪問后臺微服務的權限校驗使用jwt

官網:https://jwt.io

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-4nrVKH2U-1637241962609)(assets/wps1C05.tmp.jpg)] .

GitHub上jwt的java客戶端:https://github.com/jwtk/jjwt

什么是token:https://www.cnblogs.com/xuxinstyle/p/9675541.html

1.2.數據格式

普通的token:32位UUID

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-FzHj3y5w-1637241962613)(assets/1544170019739.png)]

JWT的token:至少64位

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-5I4mPD9u-1637241962615)(assets/wps1C06.tmp.jpg)]

JWT的token包含三部分數據:

  • Header:頭部,通常頭部有兩部分信息:

    • 聲明類型type,這里是JWT(type=jwt)

    • 加密算法,自定義(rs256/base64/hs256)

      我們會對頭部進行base64加密(可解密),得到第一部分數據

  • Payload:載荷,就是有效數據,一般包含下面信息:

    • 用戶身份信息-userid,username(注意,這里因為采用base64加密,可解密,因此不要存放敏感信息)

    • 注冊聲明:如token的簽發時間,過期時間,簽發人等

      這部分也會采用base64加密,得到第二部分數據

  • Signature:base64加密,簽名,是整個數據的認證信息。一般根據前兩步的數據,再加上服務的的密鑰(secret,鹽)(不要泄漏,最好周期性更換),通過加密算法生成。用于驗證整個數據完整和可靠性

結論:

1 jwt的一個有規則的token

2 它有三部分組成:Header.payload.signature,每部分都是通過base64加密而成的

3 jwt每個部分都是可以解密的

1.3. JWT詳解

1.3.1 base64編碼原理(了解)

Base64編碼之所以稱為Base64,是因為其使用64個字符來對任意數據進行編碼,同理有Base32、Base16編碼。標準Base64編碼使用的64個字符如下:

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-ILX14xvF-1637241962617)(assets/1544369461495.png)]

這64個字符是各種字符編碼(比如ASCII碼)所使用字符的子集,并可打印。唯一有點特殊的是最后兩個字符。

Base64本質上是一種將二進制數據轉成文本數據的方案。對于非二進制數據,是先將其轉換成二進制形式,然后每連續6比特(2的6次方=64)計算其十進制值,根據該值在上面的索引表中找到對應的字符,最終得到一個文本字符串。假設我們對Hello!進行Base64編碼,按照ASCII表,其轉換過程如下圖所示:

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-coA2WN5p-1637241962619)(assets/1544369491174.png)]

可知Hello!的Base64編碼結果為SGVsbG8h,原始字符串長度為6個字符串,編碼后長度為8個字符,每3個原始字符經編碼成4個字符。

但要注意,Base64編碼是每3個原始字符編碼成4個字符,如果原始字符串長度不能被3整除,怎么辦?使用0來補充原始字符串。

以Hello!!為例,其轉換過程為:

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-lF4IQGk1-1637241962620)(assets/1544369556884.png)]

Hello!! Base64編碼的結果為 SGVsbG8hIQAA 。最后2個零值只是為了Base64編碼而補充的,在原始字符中并沒有對應的字符,那么Base64編碼結果中的最后兩個字符 AA 實際不帶有效信息,所以需要特殊處理,以免解碼錯誤。

標準Base64編碼通常用 = 字符來替換最后的 A,即編碼結果為 SGVsbG8hIQ==。因為 = 字符并不在Base64編碼索引表中,其意義在于結束符號,在Base64解碼時遇到 = 時即可知道一個Base64編碼字符串結束。

如果Base64編碼字符串不會相互拼接再傳輸,那么最后的 = 也可以省略,解碼時如果發現Base64編碼字符串長度不能被4整除,則先補充 = 字符,再解碼即可。

解碼是對編碼的逆向操作,但注意一點:對于最后的兩個 = 字符,轉換成兩個A 字符,再轉成對應的兩個6比特二進制0值,接著轉成原始字符之前,需要將最后的兩個6比特二進制0值丟棄,因為它們實際上不攜帶有效信息。

總結:

1、base64的編碼/加密原理

答:原理:將鍵盤輸入的字符用base64編碼表示

過程:將鍵盤輸入字符的ascii碼值,轉成的對應8位二進制,將該二進制6個一組拆分,并計算拆分之后的十進制值,找出十進制值在base64編碼表中對應的字母,即完成base64加密

1.3.2 jwt測試-JwtUtil的使用

  • 導入jar包

    <properties><jjwt.version>0.7.0</jjwt.version><joda-time.version>2.9.6</joda-time.version></properties><dependencies><dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt</artifactId><version>${jjwt.version}</version></dependency><!-- https://mvnrepository.com/artifact/joda-time/joda-time --><dependency><groupId>joda-time</groupId><artifactId>joda-time</artifactId><version>${joda-time.version}</version></dependency></dependencies>
  • 導入JwtUtil

    package com.czxy.util;import io.jsonwebtoken.Claims; import io.jsonwebtoken.JwtBuilder; import io.jsonwebtoken.Jwts; import io.jsonwebtoken.SignatureAlgorithm; import org.joda.time.DateTime; import javax.crypto.spec.SecretKeySpec; import javax.xml.bind.DatatypeConverter; import java.security.Key;/*** @ClassName: JwtHelper* @Description: token工具類* @author: yuanxinqi* @date: 2021/8/17 9:59* @version: V 2.0.0* @since: (jdk_1.8)*/ public class JWTUtil {/*** 獲取token中的參數** @param token* @return*/public static Claims parseToken(String token,String key) {if ("".equals(token)) {return null;}try {return Jwts.parser().setSigningKey(DatatypeConverter.parseBase64Binary(key)).parseClaimsJws(token).getBody();} catch (Exception ex) {return null;}}/*** 生成token** @param userId* @return*/public static String createToken(Integer userId,String username,String key, int expireMinutes) {SignatureAlgorithm signatureAlgorithm = SignatureAlgorithm.HS256;//生成簽名密鑰byte[] apiKeySecretBytes = DatatypeConverter.parseBase64Binary(key);Key signingKey = new SecretKeySpec(apiKeySecretBytes, signatureAlgorithm.getJcaName());//添加構成JWT的參數JwtBuilder builder = Jwts.builder() // .setHeaderParam("type", "JWT") // .setSubject(userId.toString()).claim("userId", userId) // 設置載荷信息.claim("username",username).claim("age",23).setExpiration(DateTime.now().plusMinutes(expireMinutes).toDate())// 設置超時時間.signWith(signatureAlgorithm, signingKey);//生成JWTreturn builder.compact();}public static void main(String[] args) {String token = JWTUtil.createToken(1, "zhangsan","admin", 30);System.out.println(token);Claims claims = JWTUtil.parseToken(token, "admin");System.out.println();}}
  • 編碼測試

  • 結論:

  • jwt是采用base64加密/編碼的

  • jwt的每個部分都是可以單獨解碼的

  • 在jwt中不應存放重要明感信息,因為可以解密,不安全

  • createToken源碼跟蹤–最重要的方法

  • [外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-rqT4bOLm-1637241962623)(assets/1544412771004.png)]

    1.4.JWT交互流程

    流程圖:

    [外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-Q4oz2KpQ-1637241962624)(assets/wps1C07.tmp.jpg)] .

    步驟翻譯:

    ? 1、用戶登錄

    ? 2、服務的認證,通過后根據secret生成token

    ? 3、將生成的token返回給用戶

    ? 4、用戶每次請求攜帶token

    ? 5、服務端利解讀jwt簽名,判斷簽名有效后,從Payload中獲取用戶信息

    ? 6、處理請求,返回響應結果

    因為JWT簽發的token中已經包含了用戶的身份信息,并且每次請求都會攜帶,這樣服務的就無需保存用戶信息,甚至無需去數據庫查詢,就能知道用戶身份,完全符合了Rest的無狀態規范。

    1.5.結合Zuul的鑒權流程

    我們逐步演進系統架構設計。需要注意的是:secret是簽名的關鍵,因此一定要保密,我們放到鑒權中心保存,其它任何服務中都不能獲取secret。

    在微服務架構中,我們可以把服務的鑒權操作放到網關中,將未通過鑒權的請求直接攔截,如圖:

    [外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-POdEwHDd-1637241962626)(assets/1544137895855.png)]

    流程圖解:

  • 第一個流程:用戶點擊登錄—>請求授權中心頒發jwt憑證
  • 第二個流程:用戶的每次請求都攜帶jwt憑證—>zuul判斷jwt是否正確
  • ? 1、用戶請求登錄

    ? 2、Zuul將請求轉發到授權中心,請求授權

    ? 3、授權中心校驗完成,頒發JWT憑證

    ? 4、客戶端請求其它功能,攜帶JWT

    ? 5、Zuul將jwt交給授權中心校驗,通過后放行

    ? 6、用戶請求到達微服務

    ? 7、微服務將jwt交給鑒權中心,鑒權同時解析用戶信息

    ? 8、鑒權中心返回用戶數據給微服務

    ? 9、微服務處理請求,返回響應

    [外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-CkdkyMJM-1637241962627)(day03-鑒權.assets/1635924909040.png)]

  • jwt-parent:統一jar包版本控制
  • jwt-pojo:實體類存放位置
  • jwt-common:工具類、常量類等存放的位置
  • jwt-auth:認證中心
  • goods-search:商品搜索服務,對外暴露商品搜索相關接口
  • user-service:用戶服務,對外暴露用戶操作相關接口,如新增用戶等
  • 結論:

  • 項目的整體架構方式
  • 搭建認證中心
  • 授權中心
  • 通過zuul進行權限過濾
  • 3. 搭建父工程jwt-parent

    3.1 創建項目

    [外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-GU9Mb4N2-1637241962628)(assets/1544145686057.png)]

    3.2 pom

    <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.3.9.RELEASE</version><relativePath/> <!-- lookup parent from repository --></parent><groupId>com.czxy</groupId><artifactId>jwt-parent</artifactId><version>0.0.1-SNAPSHOT</version><packaging>pom</packaging><name>jwt-parent</name><description>Demo project for Spring Boot</description> <properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding><java.version>1.8</java.version><spring-cloud.version>Hoxton.SR10</spring-cloud.version><mybatis.starter.version>2.1.1</mybatis.starter.version><mapper.starter.version>1.2.3</mapper.starter.version><druid.starter.version>1.1.9</druid.starter.version><mysql.version>5.1.32</mysql.version><pageHelper.starter.version>1.2.3</pageHelper.starter.version><jjwt.version>0.7.0</jjwt.version><joda-time.version>2.9.6</joda-time.version><lombok.version>1.18.18</lombok.version></properties><!-- dependencyManagement這個標簽一般用在父項目中,他不是導入jar包的標簽,只是用來限定jar包版本的標簽然后子項目依賴當前父項目,在子項目中導入需要的jar包坐標子項目無需填入版本號,完全由父項目控制--><dependencyManagement><dependencies><!-- springCloud --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>${spring-cloud.version}</version><type>pom</type><scope>import</scope></dependency><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-alibaba-dependencies</artifactId><version>2.2.6.RELEASE</version><type>pom</type><scope>import</scope></dependency><!-- mybatis啟動器 --><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>${mybatis.starter.version}</version></dependency><!-- 通用Mapper啟動器 --><dependency><groupId>tk.mybatis</groupId><artifactId>mapper-spring-boot-starter</artifactId><version>${mapper.starter.version}</version></dependency><dependency><groupId>com.github.pagehelper</groupId><artifactId>pagehelper-spring-boot-starter</artifactId><version>${pageHelper.starter.version}</version></dependency><!-- druid啟動器 --><dependency><groupId>com.alibaba</groupId><artifactId>druid-spring-boot-starter</artifactId><version>${druid.starter.version}</version></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>${mysql.version}</version></dependency><dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt</artifactId><version>${jjwt.version}</version></dependency><!-- https://mvnrepository.com/artifact/joda-time/joda-time --><dependency><groupId>joda-time</groupId><artifactId>joda-time</artifactId><version>${joda-time.version}</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>${lombok.version}</version></dependency></dependencies></dependencyManagement><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build></project>

    4. 啟動Nacos注冊中心

    略。

    5.準備工作

    5.1 創建jwt-common模塊

    5.1.1 創建項目

    [外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-1hRwBNlu-1637241962631)(assets/1544149214578.png)]

    5.1.2 pom

    <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><parent><artifactId>jwt-parent</artifactId><groupId>com.czxy</groupId><version>0.0.1-SNAPSHOT</version></parent><modelVersion>4.0.0</modelVersion><artifactId>jwt-common</artifactId><dependencies><dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt</artifactId></dependency><!-- https://mvnrepository.com/artifact/joda-time/joda-time --><dependency><groupId>joda-time</groupId><artifactId>joda-time</artifactId></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency></dependencies> </project>

    5.1.3 加入工具類

    [外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-qE0i6MGG-1637241962632)(assets/1544149312057.png)]

    5.2 創建jwt-pojo模塊

    5.2.1 創建項目

    [外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-C8xXJqeB-1637241962633)(assets/1544149421296.png)]

    5.2.2 POM

    <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><parent><artifactId>jwt-parent</artifactId><groupId>com.czxy</groupId><version>0.0.1-SNAPSHOT</version></parent><modelVersion>4.0.0</modelVersion><artifactId>jwt-pojo</artifactId><dependencies><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency></dependencies></project>

    5.2.3 創建實體類

    Goods商品實體類

    @Data @AllArgsConstructor @NoArgsConstructor public class Goods {private Integer skuid;private String goodsName;private Double price;}

    User實體類

    @Data @AllArgsConstructor @NoArgsConstructor public class User {private Integer id;private String username;private String password;}

    6. 搭建goods-search

    6.1 功能分析

    1、用戶未登陸狀態,可以搜索商品信息

    2、goods-search為商品搜索服務,接收用戶頁面搜索請求

    實現步驟:

    1、pojo

    2、controller

    4、service

    5、dao

    6.2 創建項目

    [外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-WJKtfbH8-1637241962634)(assets/1544146774939.png)]

    6.3 pom

    <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>com.czxy</groupId><artifactId>jwt-parent</artifactId><version>0.0.1-SNAPSHOT</version></parent><artifactId>goods-search</artifactId><packaging>jar</packaging><name>goods-search</name><description>Demo project for Spring Boot</description><dependencies><dependency><groupId>com.czxy</groupId><artifactId>jwt-pojo01</artifactId><version>0.0.1-SNAPSHOT</version></dependency><dependency><groupId>com.czxy</groupId><artifactId>jwt-common01</artifactId><version>0.0.1-SNAPSHOT</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId></dependency><!--mybatis--> <!-- <dependency>--> <!-- <groupId>org.mybatis.spring.boot</groupId>--> <!-- <artifactId>mybatis-spring-boot-starter</artifactId>--> <!-- </dependency>--><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency><!--nacos配置管理依賴--><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build></project>

    6.4 bootstrap.yml配置

    spring:application:name: goods-serviceprofiles:active: devcloud:nacos:server-addr: localhost:8848config:file-extension: yaml server:port: 7000

    6.5 功能實現

    模擬商品搜索功能

    [外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-yArJ62w5-1637241962635)(day03-鑒權.assets/1635924665753.png)]

    6.6 啟動類

    @SpringBootApplication public class GoodsSearch01Application {public static void main(String[] args) {SpringApplication.run(GoodsSearch01Application.class, args);}}

    6.7 功能測試

    [外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-jIhjuFav-1637241962636)(day03-鑒權.assets/1635924997419.png)]

    7 搭建user-service服務

    7.1 功能分析

    • 1、提供用戶操作相關的接口

    7.2 搭建項目

    [外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-3lpWjuq9-1637241962637)(assets/1544150836990.png)]

    7.3 pom

    <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>com.czxy</groupId><artifactId>jwt-parent</artifactId><version>0.0.1-SNAPSHOT</version></parent><artifactId>user-service</artifactId><packaging>jar</packaging><name>user-service</name><description>Demo project for Spring Boot</description><dependencies><dependency><groupId>com.czxy</groupId><artifactId>jwt-pojo01</artifactId><version>0.0.1-SNAPSHOT</version></dependency><dependency><groupId>com.czxy</groupId><artifactId>jwt-common01</artifactId><version>0.0.1-SNAPSHOT</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId></dependency><!--mybatis--> <!-- <dependency>--> <!-- <groupId>org.mybatis.spring.boot</groupId>--> <!-- <artifactId>mybatis-spring-boot-starter</artifactId>--> <!-- </dependency>--><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency><!--nacos配置管理依賴--><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build></project>

    7.4 bootstrap.yml

    spring:application:name: userserviceprofiles:active: devcloud:nacos:server-addr: localhost:8848config:file-extension: yaml server:port: 8000

    7.5 功能實現

    • 提供用戶新增接口

    [外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-SKlcokqQ-1637241962638)(day03-鑒權.assets/1635927207836.png)]

    7.6 啟動類

    @SpringBootApplication public class UserService01Application {public static void main(String[] args) {SpringApplication.run(UserService01Application.class, args);}}

    7.7 功能測試

    [外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-CmQsnSnm-1637241962639)(assets/1544151169467.png)]

    8. 授權中心jwt-auth

    授權中心的主要職責:

    • 用戶鑒權:

      • 接收用戶的登錄請求,通過用戶中心的接口進行校驗,通過后生成JWT
      • 使用私鑰生成JWT并返回
    • 服務鑒權:微服務間的調用不經過Zuul,會有風險,需要鑒權中心進行認證

      • 原理與用戶鑒權類似,但邏輯稍微復雜一些(此處我們不做實現)

    因為生成jwt,解析jwt這樣的行為以后在其它微服務中也會用到,因此我們會抽取成工具。我們把鑒權中心進行聚合,一個工具module,一個提供服務的module

    8.1 創建授權中心

    [外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-1fNK5guS-1637241962640)(assets/1544150023374.png)]

    8.2 pom

    <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>com.czxy</groupId><artifactId>jwt-parent</artifactId><version>0.0.1-SNAPSHOT</version></parent><artifactId>jwt-auth</artifactId><packaging>jar</packaging><name>jwt-auth</name><description>Demo project for Spring Boot</description><dependencies><dependency><groupId>com.czxy</groupId><artifactId>jwt-pojo01</artifactId><version>0.0.1-SNAPSHOT</version></dependency><dependency><groupId>com.czxy</groupId><artifactId>jwt-common01</artifactId><version>0.0.1-SNAPSHOT</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId></dependency><!--mybatis--><!-- <dependency>--><!-- <groupId>org.mybatis.spring.boot</groupId>--><!-- <artifactId>mybatis-spring-boot-starter</artifactId>--><!-- </dependency>--><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency><!--nacos配置管理依賴--><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build></project>

    8.3 bootstrap.yml

    spring:application:name: authserviceprofiles:active: devcloud:nacos:server-addr: localhost:8848config:file-extension: yaml server:port: 9000

    8.4 功能實現

    • 提供登錄接口

    [外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-FOihNCnN-1637241962641)(day03-鑒權.assets/1635928385191.png)]

    8.5 啟動類

    @SpringBootApplication public class JwtAuth01Application {public static void main(String[] args) {SpringApplication.run(JwtAuth01Application.class, args);}}

    8.6 功能測試

    [外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-eymWbhLM-1637241962642)(day03-鑒權.assets/1635928435655.png)]

    9. Zuul網關jwt-gateway

    9.1 功能分析

    • 1、對所有請求進行過濾
    • 2、如果用戶發起的是登錄操作或者是商品搜索操作,放行
    • 3、如果用戶發起的是對user-service服務的操作,獲取并解析token,如果token存在且有效,放行;否則響應錯誤頁面

    9.2 搭建jwt-zuul項目

    [外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-v6UvdvaL-1637241962643)(day03-鑒權.assets/1635928105985.png)]

    9.3 pom

    <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><parent><artifactId>jwt-parent</artifactId><groupId>com.czxy</groupId><version>0.0.1-SNAPSHOT</version></parent><modelVersion>4.0.0</modelVersion><artifactId>jwt-zuul</artifactId><dependencies><!--網關--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-gateway</artifactId></dependency><!--nacos服務發現依賴--><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build> </project>

    9.4 yml

    server:port: 10010 # 網關端口 spring:application:name: gateway # 服務名稱cloud:nacos:server-addr: localhost:8848 # nacos地址gateway:routes: # 網關路由配置- id: goods-service # 路由id,自定義,只要唯一即可# uri: http://127.0.0.1:8081 # 路由的目標地址 http就是固定地址uri: lb://goodsservice # 路由的目標地址 lb就是負載均衡,后面跟服務名稱predicates: # 路由斷言,也就是判斷請求是否符合路由規則的條件- Path=/search/** # 這個是按照路徑匹配,只要以/user/開頭就符合要求- id: user-serviceuri: lb://userservicepredicates:- Path=/user/**- id: auth-serviceuri: lb://authservicepredicates:- Path=/auth/**

    9.5 功能實現

    • 編寫鑒權過濾器
    @Component @Order(-1) public class JWTFilter implements GlobalFilter {@Overridepublic Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {String url = exchange.getRequest().getURI().getPath();System.out.println(url);// 1 判斷URLif(url.toString().contains("login")){System.out.println("無需登錄,直接放行");return chain.filter(exchange);}// 2.獲取請求參數 // MultiValueMap<String, String> params = exchange.getRequest().getQueryParams(); // // 3.獲取authorization參數 // String token = params.getFirst("authorization");List<String> tokens = exchange.getRequest().getHeaders().get("authorization");// 4判斷是否為空if(tokens!=null&&(tokens.size()==1)){// 5 解析tokenClaims claims = JWTUtil.parseToken(tokens.get(0), "user");//6 判斷解析是否成if(claims!=null){//7 成功了,放行return chain.filter(exchange);}}// 8.攔截// 8.1.禁止訪問,設置狀態碼exchange.getResponse().setStatusCode(HttpStatus.FORBIDDEN);// 8.2.結束處理return exchange.getResponse().setComplete();} }

    9.6 功能測試

    • 商品搜索(未登錄)

      [外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-2Xwc0PwY-1637241962644)(day03-鑒權.assets/1635935024529.png)]

    • 用戶新增(未登錄)

    [外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-MtaCk0i8-1637241962645)(assets/1544152669056.png)]

    • 用戶登錄

    [外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-zERusi4u-1637241962646)(day03-鑒權.assets/1635935038652.png)]

    • 攜帶token,進行用戶新增

    [外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-zB91dygV-1637241962648)(day03-鑒權.assets/1635935065491.png)]

    總結

    以上是生活随笔為你收集整理的SpringCloud鉴权的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。