热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

springboot项目整合token,实现项目的认证与授权(提供代码)

目录1jwt验证流程2token组成3代码实现1jwt验证流程首先,前端通过Web表单将自己的用户名和密码发送到后端的接口。这一过程--般是一个HTTPPOST请


目录

  • 1 jwt验证流程
  • 2 token组成
  • 3 代码实现


1 jwt验证流程

首先,前端通过Web表单将自己的用户名和密码发送到后端的接口。这一过程-
-般是一 个HTTP POST请求。建议的方式是通过SSL加密的传输(https协议)
,从而避免敏感信息被嗅探。后端核对用户名和密码成功后,将用户的id等其他信息作为JWT Payload
(负载),将其与头部分别进行Base64编码拼接后签名,形成一个JWT(Token)
形成的JWT就是一个形同11. zzz. xxx的字符串。token head .payload . singurater后端将JWT字符串作为登录成功的返回结果返回给前端。
前端可以将返回的结果保存在localStorage或sessionStorage上,
退出登录时前端删除保存的JWT即可。前端在每次请求时将JWT放入HTTP Header中的Authorization位。
(解决XSS和XSRF问题)后端检查是否存在,如存在验证JWT的有效性。例如,检查签名是否正确;
检查Token是否过期;检查Token的接收方是否是自己(可选)验证通过后后端使用JWT中包含的用户信息进行其他逻辑操作,
返回相应结果。

2 token组成

在这里插入图片描述
在这里插入图片描述


3 代码实现

1 在我们的springboot项目里面,加入jar包

<!--引入jwt--><dependency><groupId>com.auth0</groupId><artifactId>java-jwt</artifactId><version>3.10.3</version></dependency>

2 工具类

package com.chilly.utils;import com.auth0.jwt.JWT;
import com.auth0.jwt.JWTCreator;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.interfaces.DecodedJWT;import java.util.Calendar;
import java.util.Map;/****/
public class JWTUtils {private static String SECRET &#61; "token!Q&#64;W#E$R";/*** 生产token*/public static String getToken(Map<String, String> map) {JWTCreator.Builder builder &#61; JWT.create();//payload 将用户信息放到令牌里面map.forEach((k, v) -> {builder.withClaim(k, v);});Calendar instance &#61; Calendar.getInstance();instance.add(Calendar.DATE, 7); //默认7天过期builder.withExpiresAt(instance.getTime());//指定令牌的过期时间String token &#61; builder.sign(Algorithm.HMAC256(SECRET));//签名return token;}/*** 验证token*/public static DecodedJWT verify(String token) {//如果有任何验证异常&#xff0c;此处都会抛出异常DecodedJWT decodedJWT &#61; JWT.require(Algorithm.HMAC256(SECRET)).build().verify(token);return decodedJWT;}// /**
// * 获取token中的 payload
// */
// public static DecodedJWT getToken(String token) {
// DecodedJWT decodedJWT &#61; JWT.require(Algorithm.HMAC256(SECRET)).build().verify(token);
// return decodedJWT;
// }
}

3 写拦截器

&#64;Slf4j
public class JWTInterceptor implements HandlerInterceptor {&#64;Overridepublic boolean preHandle(HttpServletRequest request,HttpServletResponse response,Object handler) throws Exception {//获取请求头中的令牌String token &#61; request.getHeader("token");log.info("当前token为&#xff1a;{}", token);Map<String, Object> map &#61; new HashMap<>();try {JWTUtils.verify(token);return true;} catch (SignatureVerificationException e) {e.printStackTrace();map.put("msg", "签名不一致");} catch (TokenExpiredException e) {e.printStackTrace();map.put("msg", "令牌过期");} catch (AlgorithmMismatchException e) {e.printStackTrace();map.put("msg", "算法不匹配");} catch (InvalidClaimException e) {e.printStackTrace();map.put("msg", "失效的payload");} catch (Exception e) {e.printStackTrace();map.put("msg", "token无效");}map.put("state", false);//响应到前台: 将map转为jsonString json &#61; new ObjectMapper().writeValueAsString(map);response.setContentType("application/json;charset&#61;UTF-8");response.getWriter().println(json);return false;}
}

4 写配置类&#xff0c;就是对哪些请求进行拦截

&#64;Configuration
public class InterceptorConfig implements WebMvcConfigurer {&#64;Overridepublic void addInterceptors(InterceptorRegistry registry) {
// addInterceptor 就是加过滤器registry.addInterceptor(new JWTInterceptor()).addPathPatterns("/user/test").excludePathPatterns("/user/login");}
}

5 写controller

&#64;RestController
&#64;Slf4j
public class UserController {&#64;Resourceprivate UserService userService;&#64;GetMapping("/user/login")public Map<String, Object> login(User user) {log.info("用户名&#xff1a;{}", user.getName());log.info("password: {}", user.getPassword());Map<String, Object> map &#61; new HashMap<>();try {User userDB &#61; userService.login(user);Map<String, String> payload &#61; new HashMap<>();payload.put("id", userDB.getId());payload.put("name", userDB.getName());String token &#61; JWTUtils.getToken(payload);map.put("state", true);map.put("msg", "登录成功");map.put("token", token);return map;} catch (Exception e) {e.printStackTrace();map.put("state", false);map.put("msg", e.getMessage());map.put("token", "");}return map;}&#64;PostMapping("/user/test")public Map<String, Object> test(HttpServletRequest request) {String token &#61; request.getHeader("token");DecodedJWT verify &#61; JWTUtils.verify(token);String id &#61; verify.getClaim("id").asString();String name &#61; verify.getClaim("name").asString();log.info("用户id&#xff1a;{}", id);log.info("用户名: {}", name);//TODO 业务逻辑Map<String, Object> map &#61; new HashMap<>();map.put("state", true);map.put("msg", "请求成功");return map;}}

以后在请求头里面加上token才可以请求成功


推荐阅读
  • 在PHP中实现腾讯云接口签名,以完成人脸核身功能的对接与签名配置时,需要注意将文档中的POST请求改为GET请求。具体步骤包括:使用你的`secretKey`生成签名字符串`$srcStr`,格式为`GET faceid.tencentcloudapi.com?`,确保参数正确拼接,避免因请求方法错误导致的签名问题。此外,还需关注API的其他参数要求,确保请求的完整性和安全性。 ... [详细]
  • 优化后的标题:深入探讨网关安全:将微服务升级为OAuth2资源服务器的最佳实践
    本文深入探讨了如何将微服务升级为OAuth2资源服务器,以订单服务为例,详细介绍了在POM文件中添加 `spring-cloud-starter-oauth2` 依赖,并配置Spring Security以实现对微服务的保护。通过这一过程,不仅增强了系统的安全性,还提高了资源访问的可控性和灵活性。文章还讨论了最佳实践,包括如何配置OAuth2客户端和资源服务器,以及如何处理常见的安全问题和错误。 ... [详细]
  • 深入探索HTTP协议的学习与实践
    在初次访问某个网站时,由于本地没有缓存,服务器会返回一个200状态码的响应,并在响应头中设置Etag和Last-Modified等缓存控制字段。这些字段用于后续请求时验证资源是否已更新,从而提高页面加载速度和减少带宽消耗。本文将深入探讨HTTP缓存机制及其在实际应用中的优化策略,帮助读者更好地理解和运用HTTP协议。 ... [详细]
  • 深入解析 Vue 中的 Axios 请求库
    本文深入探讨了 Vue 中的 Axios 请求库,详细解析了其核心功能与使用方法。Axios 是一个基于 Promise 的 HTTP 客户端,支持浏览器和 Node.js 环境。文章首先介绍了 Axios 的基本概念,随后通过具体示例展示了如何在 Vue 项目中集成和使用 Axios 进行数据请求。无论你是初学者还是有经验的开发者,本文都能为你解决 Vue.js 相关问题提供有价值的参考。 ... [详细]
  • 深入解析JWT的实现与应用
    本文深入探讨了JSON Web Token (JWT) 的实现机制及其应用场景。JWT 是一种基于 RFC 7519 标准的开放性认证协议,用于在各方之间安全地传输信息。文章详细分析了 JWT 的结构、生成和验证过程,并讨论了其在现代 Web 应用中的实际应用案例,为开发者提供了全面的理解和实践指导。 ... [详细]
  • 利用爬虫技术抓取数据,结合Fiddler与Postman在Chrome中的应用优化提交流程
    本文探讨了如何利用爬虫技术抓取目标网站的数据,并结合Fiddler和Postman工具在Chrome浏览器中的应用,优化数据提交流程。通过详细的抓包分析和模拟提交,有效提升了数据抓取的效率和准确性。此外,文章还介绍了如何使用这些工具进行调试和优化,为开发者提供了实用的操作指南。 ... [详细]
  • 本文详细解析了微信服务端示例类的功能与应用。其中,`ClientResponseHandler` 类主要用于处理微信支付所需的响应数据,而 `TenpayHttpClient` 则是对 HTTP 请求(包括 GET 和 POST 方法)进行了封装,以便在内部调用时更加便捷和高效。这些工具类在实际开发中起到了关键作用,开发者无需深入了解其底层实现细节,即可轻松集成微信支付功能。 ... [详细]
  • 通过使用七牛云存储服务,本文详细介绍了如何将本地图片高效上传至云端,并实现了内容的便捷管理。借助七牛云的 Python SDK,文章提供了从认证到文件上传的具体代码示例,包括导入必要的库、生成上传凭证以及处理文件路径等关键步骤。此外,还探讨了如何利用七牛云的 URL 安全编码功能,确保数据传输的安全性和可靠性。 ... [详细]
  • FastDFS Nginx 扩展模块的源代码解析与技术剖析
    FastDFS Nginx 扩展模块的源代码解析与技术剖析 ... [详细]
  • 如何在 Angular 4 中实现跨域调用百度人脸识别 API? ... [详细]
  • 揭秘腾讯云CynosDB计算层设计优化背后的不为人知的故事与技术细节
    揭秘腾讯云CynosDB计算层设计优化背后的不为人知的故事与技术细节 ... [详细]
  • C#微信开发入门教程第二篇:新手快速上手指南,含详细视频讲解
    在距离上次课程一个多星期后,我们终于带来了第二讲的内容。虽然原计划是一周一次更新,但由于工作繁忙有所延迟。近期在交流群中发现,一些初学者已经能够熟练调用微信接口,但对微信公众平台的消息接收处理机制还不够了解。因此,本次课程将详细介绍如何高效处理微信公众平台的消息接收,并提供详细的视频讲解,帮助大家快速上手。 ... [详细]
  • 通过优化模板消息机制,本研究提出了一种高效的信息化推送方案。该方案利用获取的访问令牌(access token)和指定的模板ID,实现了精准且快速的信息推送,显著提升了用户体验和信息传递效率。具体实现中,通过调用相关API接口,确保了消息的准确性和及时性,为用户提供更加便捷的服务。 ... [详细]
  • HBase在金融大数据迁移中的应用与挑战
    随着最后一台设备的下线,标志着超过10PB的HBase数据迁移项目顺利完成。目前,新的集群已在新机房稳定运行超过两个月,监控数据显示,新集群的查询响应时间显著降低,系统稳定性大幅提升。此外,数据消费的波动也变得更加平滑,整体性能得到了显著优化。 ... [详细]
  • 深入解析OSI七层架构与TCP/IP协议体系
    本文详细探讨了OSI七层模型(Open System Interconnection,开放系统互连)及其与TCP/IP协议体系的关系。OSI模型将网络通信过程划分为七个层次,每个层次负责不同的功能,从物理层到应用层逐步实现数据传输和处理。通过对比分析,本文揭示了OSI模型与TCP/IP协议在结构和功能上的异同,为理解现代网络通信提供了全面的视角。 ... [详细]
author-avatar
手机用户2502905381
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有