基于JWT的spring boot權(quán)限驗證技術(shù)實現(xiàn)教程
JWT簡介
Json Web Token(JWT):JSON網(wǎng)絡(luò)令牌,是為了在網(wǎng)絡(luò)應(yīng)用環(huán)境間傳遞聲明而制定的一種基于JSON的開放標(biāo)準(zhǔn)((RFC 7519)。JWT是一個輕便的安全跨平臺傳輸格式,定義了一個緊湊的自包含的方式用于通信雙方之間以 JSON 對象行使安全的傳遞信息。因為數(shù)字簽名的存在,這些信息是可信的。
實現(xiàn)步驟:
環(huán)境spring boot
1、添加jwt依賴
<dependency>
<groupId>com.auth0</groupId>
<artifactId>java-jwt</artifactId>
<version>3.8.1</version>
</dependency>
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
<version>0.9.1</version>
</dependency>
2、在src下創(chuàng)建annotation包
新建自定義注解類 JwtToken
package com.qf.tyleryue_one.annotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* 自定義注解:方法前 表示方法需要攔截
*/
@Target({ElementType.METHOD,ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface JwtToken {
}
3、在src下創(chuàng)建utils包
新建自定義JwtUtils工具類
package com.qf.tyleryue_one.utils;
import com.auth0.jwt.JWT;
import com.auth0.jwt.JWTCreator;
import com.auth0.jwt.JWTVerifier;
import com.auth0.jwt.algorithms.Algorithm;
import jdk.internal.org.objectweb.asm.TypeReference;
import java.util.Date;
/**
* 用來生成簽名,校驗簽名,通過簽名
*/
public class JwtUtils {
//令牌有效時間
private final static long EXPIRE_TIME=5*60*1000;
//密鑰
private final static String SECRECT="Tyler_Yue_key";
/**
* 創(chuàng)建令牌
*/
public static String sign(String userId){
//構(gòu)建失效時鐘
Date exipre_date = new Date(System.currentTimeMillis() + EXPIRE_TIME);
//創(chuàng)建令牌
JWTCreator.Builder builder = JWT.create();
//給jwt令牌playload中放入發(fā)令牌放的用戶
//給userid用戶發(fā)令牌
builder.withAudience(userId);
//設(shè)置令牌失效時間
builder.withExpiresAt(exipre_date);
//對令牌密鑰進行加密
Algorithm algorithm = Algorithm.HMAC256(SECRECT);
String sign = builder.sign(algorithm);
return sign;//返回令牌
}
/**
* 驗證令牌
*/
public static boolean verifyToken(String token){
try {
//生成校驗器
Algorithm algorithm = Algorithm.HMAC256(SECRECT);
//校驗
JWTVerifier build = JWT.require(algorithm).build();
//無異常則校驗成功
return true;
} catch (Exception e) {
throw new RuntimeException("令牌過期");
}
}
}
4、在src下新建vo包
封裝一個返回用戶帶令牌的 對象
package com.qf.tyleryue_one.vo;
import com.alibaba.druid.filter.AutoLoad;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* 封裝一個返回 含令牌的用戶對象
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class TokenVo {
//用戶名
private String usernaem;
//令牌名
private String token;
}
5、舉例controller層用戶登錄業(yè)務(wù)登錄帶令牌
package com.qf.tyleryue_one.controller;
import com.qf.tyleryue_one.entity.VueUser;
import com.qf.tyleryue_one.service.VueUserService;
import com.qf.tyleryue_one.utils.JwtUtils;
import com.qf.tyleryue_one.vo.Msg;
import com.qf.tyleryue_one.vo.TokenVo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import java.util.UUID;
/**
* 登錄業(yè)務(wù)
*/
@Controller
public class VueUserController {
@Autowired
private VueUserService vueUserService;
@RequestMapping(value = "/dealLogin",method = RequestMethod.POST)
@CrossOrigin
@ResponseBody
public Msg login(@RequestBody VueUser vueUser){
VueUser vueUser1 = vueUserService.selectByUsername(vueUser.getUsername());
if (vueUser1!=null){
if (vueUser1.getPassword().equals(vueUser.getPassword())){
//密碼匹配,發(fā)放令牌
///隨機生成字符串未userid
String userid = UUID.randomUUID().toString();
String token = JwtUtils.sign(userid);
//封裝令牌對象
TokenVo tokenVo = new TokenVo(vueUser.getUsername(), token);
return new Msg(200,"登錄成功,令牌已發(fā)放",tokenVo);
}else {
return new Msg(403,"密碼錯誤",null);
}
}else {
return new Msg(403,"用戶不存在",null);
}
}
}
總結(jié)
到此這篇關(guān)于基于JWT的spring boot權(quán)限驗證技術(shù)實現(xiàn)教程的文章就介紹到這了,更多相關(guān)JWT springboot權(quán)限驗證技術(shù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringBoot使用H2嵌入式數(shù)據(jù)庫的實例代碼
本文通過實例代碼給大家介紹了SpringBoot使用H2嵌入式數(shù)據(jù)庫的相關(guān)知識,代碼簡單易懂,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友參考下吧2021-10-10
springboot項目配置多數(shù)據(jù)庫連接的示例詳解
這篇文章主要介紹了springboot項目配置多數(shù)據(jù)庫連接的示例,本文通過示例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友參考下吧2023-12-12
通過Java連接SQL?Server數(shù)據(jù)庫的超詳細操作流程
java相對于其他語言(例如c,c++等)連接數(shù)據(jù)庫要方便得多,那么如何連接呢?下面這篇文章主要給大家介紹了關(guān)于通過Java連接SQL?Server數(shù)據(jù)庫的超詳細操作流程,需要的朋友可以參考下2023-03-03
Java實現(xiàn)簡易版聯(lián)網(wǎng)坦克對戰(zhàn)小游戲(附源碼)
這篇文章主要給大家介紹了關(guān)于Java實現(xiàn)簡易版聯(lián)網(wǎng)坦克對戰(zhàn)小游戲的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家學(xué)習(xí)或者使用java具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2019-04-04
Java使用 try-with-resources 實現(xiàn)自動關(guān)閉資源的方法
這篇文章主要介紹了Java使用 try-with-resources 實現(xiàn)自動關(guān)閉資源的方法,本文通過示例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-06-06
Spring Boot項目實戰(zhàn)之?dāng)r截器與過濾器
這篇文章主要介紹了Spring Boot項目實戰(zhàn)之?dāng)r截器與過濾器,文中給大家詳細介紹了springboot 攔截器和過濾器的基本概念,過濾器的配置,需要的朋友可以參考下2018-01-01
使用jekins自動構(gòu)建部署java maven項目的方法步驟
這篇文章主要介紹了使用jekins自動構(gòu)建部署java maven項目的方法步驟,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-01-01

