基于JWT的spring boot權(quán)限驗(yàn)證技術(shù)實(shí)現(xiàn)教程
JWT簡(jiǎn)介
Json Web Token(JWT):JSON網(wǎng)絡(luò)令牌,是為了在網(wǎng)絡(luò)應(yīng)用環(huán)境間傳遞聲明而制定的一種基于JSON的開(kāi)放標(biāo)準(zhǔn)((RFC 7519)。JWT是一個(gè)輕便的安全跨平臺(tái)傳輸格式,定義了一個(gè)緊湊的自包含的方式用于通信雙方之間以 JSON 對(duì)象行使安全的傳遞信息。因?yàn)閿?shù)字簽名的存在,這些信息是可信的。
實(shí)現(xiàn)步驟:
環(huán)境spring boot
1、添加jwt依賴(lài)
<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包
新建自定義注解類(lèi) 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工具類(lèi)
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; /** * 用來(lái)生成簽名,校驗(yàn)簽名,通過(guò)簽名 */ public class JwtUtils { //令牌有效時(shí)間 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)建失效時(shí)鐘 Date exipre_date = new Date(System.currentTimeMillis() + EXPIRE_TIME); //創(chuàng)建令牌 JWTCreator.Builder builder = JWT.create(); //給jwt令牌playload中放入發(fā)令牌放的用戶(hù) //給userid用戶(hù)發(fā)令牌 builder.withAudience(userId); //設(shè)置令牌失效時(shí)間 builder.withExpiresAt(exipre_date); //對(duì)令牌密鑰進(jìn)行加密 Algorithm algorithm = Algorithm.HMAC256(SECRECT); String sign = builder.sign(algorithm); return sign;//返回令牌 } /** * 驗(yàn)證令牌 */ public static boolean verifyToken(String token){ try { //生成校驗(yàn)器 Algorithm algorithm = Algorithm.HMAC256(SECRECT); //校驗(yàn) JWTVerifier build = JWT.require(algorithm).build(); //無(wú)異常則校驗(yàn)成功 return true; } catch (Exception e) { throw new RuntimeException("令牌過(guò)期"); } } }
4、在src下新建vo包
封裝一個(gè)返回用戶(hù)帶令牌的 對(duì)象
package com.qf.tyleryue_one.vo; import com.alibaba.druid.filter.AutoLoad; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; /** * 封裝一個(gè)返回 含令牌的用戶(hù)對(duì)象 */ @Data @AllArgsConstructor @NoArgsConstructor public class TokenVo { //用戶(hù)名 private String usernaem; //令牌名 private String token; }
5、舉例controller層用戶(hù)登錄業(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ā)放令牌 ///隨機(jī)生成字符串未userid String userid = UUID.randomUUID().toString(); String token = JwtUtils.sign(userid); //封裝令牌對(duì)象 TokenVo tokenVo = new TokenVo(vueUser.getUsername(), token); return new Msg(200,"登錄成功,令牌已發(fā)放",tokenVo); }else { return new Msg(403,"密碼錯(cuò)誤",null); } }else { return new Msg(403,"用戶(hù)不存在",null); } } }
總結(jié)
到此這篇關(guān)于基于JWT的spring boot權(quán)限驗(yàn)證技術(shù)實(shí)現(xiàn)教程的文章就介紹到這了,更多相關(guān)JWT springboot權(quán)限驗(yàn)證技術(shù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
java HashMap通過(guò)value反查key的代碼示例
本文講解了java HashMap通過(guò)value反查key的方法,直接提供代碼供大家參考使用2013-11-11集成apollo動(dòng)態(tài)日志取締logback-spring.xml配置
這篇文章主要為大家介紹了集成apollo動(dòng)態(tài)日志取締logback-spring.xml配置的過(guò)程內(nèi)容詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助2022-02-02Java實(shí)現(xiàn)動(dòng)態(tài)創(chuàng)建類(lèi)操作示例
這篇文章主要介紹了Java實(shí)現(xiàn)動(dòng)態(tài)創(chuàng)建類(lèi)操作,結(jié)合完整示例形式分析了Java動(dòng)態(tài)創(chuàng)建類(lèi)的具體步驟與相關(guān)操作技巧,需要的朋友可以參考下2020-02-02SpringBoot集成Curator實(shí)現(xiàn)Zookeeper基本操作的代碼示例
Zookeeper是一個(gè)Apache開(kāi)源的分布式的應(yīng)用,為系統(tǒng)架構(gòu)提供協(xié)調(diào)服務(wù),ZooKeeper的目標(biāo)就是封裝好復(fù)雜易出錯(cuò)的關(guān)鍵服務(wù),將簡(jiǎn)單易用的接口和性能高效、功能穩(wěn)定的系統(tǒng)提供給用戶(hù),本文給大家介紹了SpringBoot集成Curator實(shí)現(xiàn)Zookeeper基本操作,需要的朋友可以參考下2024-05-05java抓取網(wǎng)頁(yè)數(shù)據(jù)示例
要通java獲取整個(gè)網(wǎng)頁(yè)的html內(nèi)容,或者某個(gè)網(wǎng)絡(luò)文件的內(nèi)容,可以使用java提供的HttpURLConnection類(lèi)來(lái)實(shí)現(xiàn)對(duì)網(wǎng)頁(yè)內(nèi)容的抓取2014-03-03Java日常練習(xí)題,每天進(jìn)步一點(diǎn)點(diǎn)(55)
下面小編就為大家?guī)?lái)一篇Java基礎(chǔ)的幾道練習(xí)題(分享)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧,希望可以幫到你2021-08-08FuncGPT慧函數(shù)保護(hù)數(shù)據(jù)安全提高代碼質(zhì)量減少軟件故障(java示例)
這篇文章主要為大家介紹了FuncGPT慧函數(shù)保護(hù)數(shù)據(jù)安全提高代碼質(zhì)量減少軟件故障(java示例),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-10-10使用Spring Boot實(shí)現(xiàn)操作數(shù)據(jù)庫(kù)的接口的過(guò)程
本文給大家分享使用Spring Boot實(shí)現(xiàn)操作數(shù)據(jù)庫(kù)的接口的過(guò)程,包括springboot原理解析及實(shí)例代碼詳解,感興趣的朋友跟隨小編一起看看吧2021-07-07簡(jiǎn)單了解JAVA內(nèi)存泄漏和溢出區(qū)別及聯(lián)系
這篇文章主要介紹了簡(jiǎn)單了解JAVA內(nèi)存泄漏和溢出區(qū)別及聯(lián)系,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-03-03