javascript
SpringCloud鉴权
1.JWT
1.0 為什么要學習JWT?
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-2Ok258P2-1637241962605)(assets/1544169629935.png)]
1.1.簡介
JWT,全稱是Json Web Token, 是JSON風格輕量級的授權和身份認證規(guī)范,可實現(xiàn)無狀態(tài)、分布式的Web應用授權;它是分布式服務權限控制的標準解決方案!
它跟RBAC的區(qū)別:兩者不沖突,在項目中后臺權限服務的數(shù)據(jù)庫設計使用RBAC,而前端項目訪問后臺微服務的權限校驗使用jwt
官網(wǎng):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.數(shù)據(jù)格式
普通的token:32位UUID
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-FzHj3y5w-1637241962613)(assets/1544170019739.png)]
JWT的token:至少64位
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-5I4mPD9u-1637241962615)(assets/wps1C06.tmp.jpg)]
JWT的token包含三部分數(shù)據(jù):
-
Header:頭部,通常頭部有兩部分信息:
-
聲明類型type,這里是JWT(type=jwt)
-
加密算法,自定義(rs256/base64/hs256)
我們會對頭部進行base64加密(可解密),得到第一部分數(shù)據(jù)
-
-
Payload:載荷,就是有效數(shù)據(jù),一般包含下面信息:
-
用戶身份信息-userid,username(注意,這里因為采用base64加密,可解密,因此不要存放敏感信息)
-
注冊聲明:如token的簽發(fā)時間,過期時間,簽發(fā)人等
這部分也會采用base64加密,得到第二部分數(shù)據(jù)
-
-
Signature:base64加密,簽名,是整個數(shù)據(jù)的認證信息。一般根據(jù)前兩步的數(shù)據(jù),再加上服務的的密鑰(secret,鹽)(不要泄漏,最好周期性更換),通過加密算法生成。用于驗證整個數(shù)據(jù)完整和可靠性
結論:
1 jwt的一個有規(guī)則的token
2 它有三部分組成:Header.payload.signature,每部分都是通過base64加密而成的
3 jwt每個部分都是可以解密的
1.3. JWT詳解
1.3.1 base64編碼原理(了解)
Base64編碼之所以稱為Base64,是因為其使用64個字符來對任意數(shù)據(jù)進行編碼,同理有Base32、Base16編碼。標準Base64編碼使用的64個字符如下:
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-ILX14xvF-1637241962617)(assets/1544369461495.png)]
這64個字符是各種字符編碼(比如ASCII碼)所使用字符的子集,并可打印。唯一有點特殊的是最后兩個字符。
Base64本質上是一種將二進制數(shù)據(jù)轉成文本數(shù)據(jù)的方案。對于非二進制數(shù)據(jù),是先將其轉換成二進制形式,然后每連續(xù)6比特(2的6次方=64)計算其十進制值,根據(jù)該值在上面的索引表中找到對應的字符,最終得到一個文本字符串。假設我們對Hello!進行Base64編碼,按照ASCII表,其轉換過程如下圖所示:
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-coA2WN5p-1637241962619)(assets/1544369491174.png)]
可知Hello!的Base64編碼結果為SGVsbG8h,原始字符串長度為6個字符串,編碼后長度為8個字符,每3個原始字符經(jīng)編碼成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編碼字符串不會相互拼接再傳輸,那么最后的 = 也可以省略,解碼時如果發(fā)現(xiàn)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中的參數(shù)** @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的參數(shù)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、服務的認證,通過后根據(jù)secret生成token
? 3、將生成的token返回給用戶
? 4、用戶每次請求攜帶token
? 5、服務端利解讀jwt簽名,判斷簽名有效后,從Payload中獲取用戶信息
? 6、處理請求,返回響應結果
因為JWT簽發(fā)的token中已經(jīng)包含了用戶的身份信息,并且每次請求都會攜帶,這樣服務的就無需保存用戶信息,甚至無需去數(shù)據(jù)庫查詢,就能知道用戶身份,完全符合了Rest的無狀態(tài)規(guī)范。
1.5.結合Zuul的鑒權流程
我們逐步演進系統(tǒng)架構設計。需要注意的是:secret是簽名的關鍵,因此一定要保密,我們放到鑒權中心保存,其它任何服務中都不能獲取secret。
在微服務架構中,我們可以把服務的鑒權操作放到網(wǎng)關中,將未通過鑒權的請求直接攔截,如圖:
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-POdEwHDd-1637241962626)(assets/1544137895855.png)]
流程圖解:
? 1、用戶請求登錄
? 2、Zuul將請求轉發(fā)到授權中心,請求授權
? 3、授權中心校驗完成,頒發(fā)JWT憑證
? 4、客戶端請求其它功能,攜帶JWT
? 5、Zuul將jwt交給授權中心校驗,通過后放行
? 6、用戶請求到達微服務
? 7、微服務將jwt交給鑒權中心,鑒權同時解析用戶信息
? 8、鑒權中心返回用戶數(shù)據(jù)給微服務
? 9、微服務處理請求,返回響應
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-CkdkyMJM-1637241962627)(day03-鑒權.assets/1635924909040.png)]
結論:
3. 搭建父工程jwt-parent
3.1 創(chuàng)建項目
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(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 創(chuàng)建jwt-common模塊
5.1.1 創(chuàng)建項目
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(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 創(chuàng)建jwt-pojo模塊
5.2.1 創(chuàng)建項目
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(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 創(chuàng)建實體類
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、用戶未登陸狀態(tài),可以搜索商品信息
2、goods-search為商品搜索服務,接收用戶頁面搜索請求
實現(xiàn)步驟:
1、pojo
2、controller
4、service
5、dao
6.2 創(chuàng)建項目
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(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: 70006.5 功能實現(xiàn)
模擬商品搜索功能
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(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: 80007.5 功能實現(xiàn)
- 提供用戶新增接口
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(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并返回
-
服務鑒權:微服務間的調用不經(jīng)過Zuul,會有風險,需要鑒權中心進行認證
- 原理與用戶鑒權類似,但邏輯稍微復雜一些(此處我們不做實現(xiàn))
因為生成jwt,解析jwt這樣的行為以后在其它微服務中也會用到,因此我們會抽取成工具。我們把鑒權中心進行聚合,一個工具module,一個提供服務的module
8.1 創(chuàng)建授權中心
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(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: 90008.4 功能實現(xiàn)
- 提供登錄接口
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(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網(wǎng)關jwt-gateway
9.1 功能分析
- 1、對所有請求進行過濾
- 2、如果用戶發(fā)起的是登錄操作或者是商品搜索操作,放行
- 3、如果用戶發(fā)起的是對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><!--網(wǎng)關--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-gateway</artifactId></dependency><!--nacos服務發(fā)現(xiàn)依賴--><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 # 網(wǎng)關端口 spring:application:name: gateway # 服務名稱cloud:nacos:server-addr: localhost:8848 # nacos地址gateway:routes: # 網(wǎng)關路由配置- id: goods-service # 路由id,自定義,只要唯一即可# uri: http://127.0.0.1:8081 # 路由的目標地址 http就是固定地址uri: lb://goodsservice # 路由的目標地址 lb就是負載均衡,后面跟服務名稱predicates: # 路由斷言,也就是判斷請求是否符合路由規(guī)則的條件- Path=/search/** # 這個是按照路徑匹配,只要以/user/開頭就符合要求- id: user-serviceuri: lb://userservicepredicates:- Path=/user/**- id: auth-serviceuri: lb://authservicepredicates:- Path=/auth/**9.5 功能實現(xiàn)
- 編寫鑒權過濾器
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鉴权的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java开发环境搭建:eclipse安装
- 下一篇: 书翻页turn.js踩的坑