色综合图-色综合图片-色综合图片二区150p-色综合图区-玖玖国产精品视频-玖玖香蕉视频

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

springboot+jwt實(shí)現(xiàn)token登陸權(quán)限認(rèn)證的實(shí)現(xiàn)

瀏覽:7日期:2023-05-14 16:15:44

一 前言

此篇文章的內(nèi)容也是學(xué)習(xí)不久,終于到周末有時(shí)間碼一篇文章分享知識(shí)追尋者的粉絲們,學(xué)完本篇文章,讀者將對(duì)token類的登陸認(rèn)證流程有個(gè)全面的了解,可以動(dòng)態(tài)搭建自己的登陸認(rèn)證過(guò)程;對(duì)小項(xiàng)目而已是個(gè)輕量級(jí)的認(rèn)證機(jī)制,符合開(kāi)發(fā)需求;

二 jwt實(shí)現(xiàn)登陸認(rèn)證流程

用戶使用賬號(hào)和面發(fā)出post請(qǐng)求 服務(wù)器接受到請(qǐng)求后使用私鑰創(chuàng)建一個(gè)jwt,這邊會(huì)生成token 服務(wù)器返回這個(gè)jwt給瀏覽器 瀏覽器需要將帶有token的jwt放入請(qǐng)求頭 每次手到客戶端請(qǐng)求,服務(wù)器驗(yàn)證該jwt的token 驗(yàn)證成功返回響應(yīng)的資源給瀏覽器。否則異常處理

三 相關(guān)介紹jwt

3.1jwt 組成

JWT的token由三段信息構(gòu)成的,將這三段信息文本用.連接一起就構(gòu)成了JWT字符串;

Header 頭部(包含了令牌的元數(shù)據(jù),并且包含簽名和或加密算法的類型) Payload 負(fù)載 Signature 簽名/簽證

eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJleHAiOjE1ODI4OTc4NDUsInVzZXJuYW1lIjoienN6eHoifQ.vyiExkFWCCmQA3PFYL0jJfIiYGWubngqB0WcgmtHOxg

3.2 jwt優(yōu)點(diǎn)

簡(jiǎn)潔(Compact): 可以通過(guò)URL,POST參數(shù)或者在HTTP header發(fā)送,數(shù)據(jù)量小,傳輸速度快 自包含(Self-contained):負(fù)載中包含了所有用戶所需要的信息,避免多次查詢數(shù)據(jù)庫(kù) .因?yàn)門(mén)oken是以JSON加密的形式保存在客戶端的,所以JWT是跨語(yǔ)言支持; 不需要在服務(wù)端保存會(huì)話信息,適用于分布式與微服務(wù);

四 jwt用戶登陸發(fā)放token

4.1 pom.xml

項(xiàng)目構(gòu)件如下

springboot 2.1; jwt 3.4.0; maven 3.5 jdk1.8 postman接口測(cè)試

<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>com.auth0</groupId> <artifactId>java-jwt</artifactId> <version>3.4.0</version> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency> </dependencies>

4.2jwt工具類

jwt工具類中有三個(gè)方法,分別是生成數(shù)字簽名用于用戶首次登陸時(shí)發(fā)送jwt給客戶端;其次是校驗(yàn)方法,用于攔截器攔截所有規(guī)則內(nèi)的url,每個(gè)請(qǐng)求都必須帶有服務(wù)器發(fā)送的jwt,經(jīng)過(guò)驗(yàn)證后才放行請(qǐng)求;最后一個(gè)獲得用戶名的方法用于查詢密鑰,在驗(yàn)證jwt時(shí)作為參數(shù)傳入;

/* * * @Author lsc * <p> JWT工具類 </p> * @Param * @Return */public class JwtUtil { // Token過(guò)期時(shí)間30分鐘 public static final long EXPIRE_TIME = 30 * 60 * 1000; /* * * @Author lsc * <p> 校驗(yàn)token是否正確 </p> * @Param token * @Param username * @Param secret * @Return boolean */ public static boolean verify(String token, String username, String secret) { try { // 設(shè)置加密算法 Algorithm algorithm = Algorithm.HMAC256(secret); JWTVerifier verifier = JWT.require(algorithm) .withClaim('username', username) .build(); // 效驗(yàn)TOKEN DecodedJWT jwt = verifier.verify(token); return true; } catch (Exception exception) { return false; } } /* * * @Author lsc * <p>生成簽名,30min后過(guò)期 </p> * @Param [username, secret] * @Return java.lang.String */ public static String sign(String username, String secret) { Date date = new Date(System.currentTimeMillis() + EXPIRE_TIME); Algorithm algorithm = Algorithm.HMAC256(secret); // 附帶username信息 return JWT.create() .withClaim('username', username) .withExpiresAt(date) .sign(algorithm); } /* * * @Author lsc * <p> 獲得用戶名 </p> * @Param [request] * @Return java.lang.String */ public static String getUserNameByToken(HttpServletRequest request) { String token = request.getHeader('token'); DecodedJWT jwt = JWT.decode(token); return jwt.getClaim('username') .asString(); }}

4.3 用戶實(shí)體

實(shí)體中包含用戶名,和密碼,一切從簡(jiǎn);

/** * @Author lsc * <p> </p> */@Datapublic class SysUser { private String username; private String password;}

4.4Controller

表現(xiàn)層代碼用戶用戶登陸認(rèn)證,認(rèn)證成功后發(fā)放token給客戶端;

/** * @Author lsc * <p> </p> */@RestControllerpublic class SysUserController { @PostMapping(value = '/login') public Map<String, Object> login(@RequestBody SysUser sysUser){ Map<String, Object> map = new HashMap<>(); String username = sysUser.getUsername(); String password = sysUser.getPassword(); // 省略 賬號(hào)密碼驗(yàn)證 // 驗(yàn)證成功后發(fā)送token String token = JwtUtil.sign(username,password); if (token != null){ map.put('code', '200'); map.put('message','認(rèn)證成功'); map.put('token', token); return map; } map.put('code', '403'); map.put('message','認(rèn)證失敗'); return map; }}

4.5 測(cè)試

測(cè)試url http://localhost:8080/login

postman post請(qǐng)求測(cè)試參數(shù)如下

{ 'username': 'zszxz', 'password': 'zszxz'}

返回內(nèi)容如下

{ 'code': '200', 'message': '認(rèn)證成功', 'token': 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJleHAiOjE1ODI4OTc4NDUsInVzZXJuYW1lIjoienN6eHoifQ.vyiExkFWCCmQA3PFYL0jJfIiYGWubngqB0WcgmtHOxg'}

五 jwt登陸攔截認(rèn)證

基于前面已經(jīng)實(shí)現(xiàn)jwt登錄認(rèn)證后發(fā)放token給客戶端;本節(jié)內(nèi)容就是將token放入請(qǐng)求頭中發(fā)送請(qǐng)求給服務(wù)器;服務(wù)器使用攔截器攔截請(qǐng)求對(duì)token進(jìn)行驗(yàn)證;驗(yàn)證成功請(qǐng)求通過(guò),否則請(qǐng)求資源失敗;

5.1自定義攔截器

自定義攔截器JwtInterceptor,實(shí)現(xiàn)HandlerInterceptor接口,每次請(qǐng)求到達(dá)之前都會(huì)驗(yàn)證token是否有效;

/** * @Author lsc * <p>token驗(yàn)證攔截器 </p> */@Componentpublic class JwtInterceptor implements HandlerInterceptor { @Autowired SysUserService sysUserService; @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { // 從 http 請(qǐng)求頭中取出 token String token = request.getHeader('token'); // 如果不是映射到方法直接通過(guò) if(!(handler instanceof HandlerMethod)){ return true; } if (token != null){ String username = JwtUtil.getUserNameByToken(request); // 這邊拿到的 用戶名 應(yīng)該去數(shù)據(jù)庫(kù)查詢獲得密碼,簡(jiǎn)略,步驟在service直接獲取密碼 boolean result = JwtUtil.verify(token,username,sysUserService.getPassword()); if(result){ System.out.println('通過(guò)攔截器'); return true; } } return false; } @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { } @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { }}

5.2 service

/** * @Author lsc * <p> 模擬查詢數(shù)據(jù)庫(kù)獲得賬號(hào)密碼 </p> */@Servicepublic class SysUserService { public String getPassword(){ return 'zszxz'; }}

5.3攔截器配置

攔截器配置中主要定義攔截請(qǐng)求規(guī)則,將攔截器注入WebMvcConfigurer;cors跨域處理;

/* * * @Author lsc * <p>攔截器配置 </p> * @Param * @Return */@Configurationpublic class InterceptorConfig implements WebMvcConfigurer { /* * * @Author lsc * <p> 設(shè)置攔截路徑 </p> * @Param [registry] * @Return void */ @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(authenticationInterceptor()) .addPathPatterns('/**') .excludePathPatterns('/login'); } /* * * @Author lsc * <p> 將攔截器注入context </p> * @Param [] * @Return com.zszxz.jwt.interceptor.JwtInterceptor */ @Bean public JwtInterceptor authenticationInterceptor() { return new JwtInterceptor(); } /* * * @Author lsc * <p>跨域支持 </p> * @Param [registry] * @Return void */ @Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping('/**') .allowedOrigins('*') .allowCredentials(true) .allowedMethods('GET', 'POST', 'DELETE', 'PUT', 'PATCH', 'OPTIONS', 'HEAD') .maxAge(3600 * 24); }}

5.4Controller

表現(xiàn)層接口用于攔截親求測(cè)試

/** * @Author lsc * <p> </p> */@RestControllerpublic class TestController { @GetMapping(value = '/api/test') public String get(){ return 'zszxz'; }}

5.5 測(cè)試

測(cè)試url http://localhost:8080/api/test

發(fā)送get請(qǐng)求給服務(wù)器,帶有請(qǐng)求頭,key為token,value為用戶首次登陸時(shí)返回的token串;

測(cè)試返回內(nèi)容如下

zszxz

六 官網(wǎng)鏈接

https://jwt.io/introduction/

到此這篇關(guān)于springboot+jwt實(shí)現(xiàn)token登陸權(quán)限認(rèn)證的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)springboot jwt token登陸權(quán)限 內(nèi)容請(qǐng)搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!

標(biāo)簽: Spring
相關(guān)文章:
主站蜘蛛池模板: 国产成人精品一区二区免费视频 | 91青草久久久久久清纯 | 久久精品大片 | 久久综合一本 | 国产精品亚洲片在线va | 米奇888在线播放欧美 | 在线观看国产日本 | 在线一区二区三区 | 日本欧美一区二区三区片 | 在线一区播放 | 国产精品免费视频一区一 | 男人女人做性全程视视频 | 国产片18在线观看 | 久久久久亚洲日日精品 | 中文字幕人成乱码在线观看 | 国产成人综合日韩精品无 | 韩国欧洲一级毛片免费 | 香蕉超级碰碰碰97视频在线观看 | 悟空影视大全免费高清 | 美女视频黄a视频美女大全 美女视频黄a视频免费全程 | 久久怡红院亚欧成人影院 | 国产成人综合怡春院精品 | 美女视频黄色的免费 | 久久视频国产 | 日韩毛片欧美一级国产毛片 | 亚洲精品久久一区二区无卡 | 日韩欧一级毛片在线播无遮挡 | 狠狠色丁香久久婷婷综 | 国产成人精品日本亚洲语音2 | 国产精品国产三级国产an不卡 | 精品伊人久久久久7777人 | 91精品欧美一区二区综合在线 | 国产乱理片在线观看夜 | 国产精品手机在线观看 | 亚洲欧美日韩在线播放 | 亚洲一区二区欧美 | 国产精品v一区二区三区 | 成人毛片1024你懂的 | 久久高清一区二区三区 | 精品日本亚洲一区二区三区 | 美国一级欧美三级 |