Springboot实现简单JWT登录鉴权

登录为啥需要鉴权?

登录需要鉴权是为了保护系统的安全性和用户的隐私。在一个 Web 应用中,用户需要提供一定的身份信息(例如用户名和密码)进行登录,登录后系统会为用户生成一个身份令牌(例如 JWT Token)来标识用户的身份。

鉴权的主要目的是确保只有经过身份验证的用户才能访问系统的受限资源和功能。未经鉴权的用户不能访问系统的敏感信息和功能,从而保护系统的数据和用户的隐私。

为什么选择JWT做登录鉴权?

选择 JWT(JSON Web Token)做登录鉴权有以下几个主要优点:

1.无状态

JWT 是无状态的,即服务端不需要保存用户的登录状态。所有的用户信息都包含在 JWT 中,因此服务端不需要在后台存储用户的登录信息。这样可以降低服务端的存储压力,也减少了服务端与客户端之间的通信次数,提高了系统的性能和可扩展性。

2.安全性

JWT 使用数字签名来保证 Token 的完整性和安全性。服务端在生成 JWT 时使用密钥对头部和载荷进行签名,客户端在接收到 JWT 后,可以通过验证签名来判断 Token 是否被篡改。这样可以防止 Token 被伪造或篡改,增强了系统的安全性。

3.跨平台支持

JWT 是基于 JSON 格式的标准化令牌,可以在不同平台之间方便地传递和解析。客户端可以将 JWT 存储在 Cookie、LocalStorage 或 SessionStorage 中,同时可以在移动端和 Web 端之间共享使用。

4.可扩展性

JWT 载荷部分可以自定义,可以存储用户的角色、权限、自定义字段等信息。这样可以在 Token 中携带更多的用户信息,减少多次查询数据库的开销,提高系统的性能。

5.简化权限管理

JWT 中可以包含用户的角色和权限信息,这样可以简化权限管理逻辑。服务端可以根据用户的角色和权限来控制用户对不同资源的访问权限,从而实现细粒度的权限控制。

JWT是token吗?

是的,JWT(JSON Web Token)是一种 Token 的实现方式。Token 是一种用于身份验证和授权的令牌,用于在客户端和服务端之间传递用户的身份信息。

JWT 是一种基于 JSON 的安全令牌,由三部分组成:头部(Header)、载荷(Payload)和签名(Signature)。这三部分分别使用 Base64 编码,并用点号连接起来,形成一个字符串,即 JWT。

实现一个简单的springboot拦截器token例子

1.创建拦截器类 TokenInterceptor.java:

import org.springframework.web.servlet.HandlerInterceptor;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;public class TokenInterceptor implements HandlerInterceptor {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {// 在这里进行 Token 鉴权逻辑// 获取请求头中的 TokenString token = request.getHeader("Authorization");if (token == null || !token.startsWith("Bearer ")) {response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);return false;}// 假设这里对 Token 进行验证,验证通过则放行,否则返回 401 未授权状态码// 这里只是简单示例,实际中可以根据业务需求来验证 Token 的有效性boolean isValidToken = validateToken(token.substring(7)); // 去除 "Bearer " 前缀if (!isValidToken) {response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);return false;}return true;}private boolean validateToken(String token) {// 假设这里对 Token 进行验证,验证通过返回 true,否则返回 false// 可以使用 JwtUtils 工具类来验证 Token 的有效性// 注意:在实际应用中,需要根据业务需求和安全要求来验证 Tokenreturn true;}
}

2.注册拦截器:

在 Spring Boot 主类中注册拦截器,使其生效:

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;@SpringBootApplication
public class MyApplication implements WebMvcConfigurer {public static void main(String[] args) {SpringApplication.run(MyApplication.class, args);}@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(new TokenInterceptor()).addPathPatterns("/api/**"); // 拦截指定路径的请求}
}

3.创建一个简单的 Controller

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
public class MyController {@GetMapping("/api/hello")public String hello() {return "Hello, World!";}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/25742.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用 Python 获取 CPU 数量

CPU 可以包含单核或多核。 单核只处理一个进程,而多核同时处理多个进程。 本篇文章将介绍使用 Python 程序查找 CPU 内核总数的不同方法。 使用 multiprocessing 模块获取 Python 中的 CPU 数量 multiprocessing 模块中的 cpu_count() 函数获取系统中的 CPU 总数。…

MyBatis@Param注解的用法

一、前言 本人在学习mybatis的过程中遇到的一个让人不爽的bug,在查找了些相关的资料后得以解决,遂记录。 二、报错及解决 mapper中有一方法: Select("select * from emp " "where name like concat(%, #{name}, %) "…

Python调用外部电商API的详细步骤

Python是一种高级编程语言,非常适合用于集成API,即应用程序编程接口。API通常是由网站和各种软件提供的接口,可以让不同的程序之间进行数据交换和通信。在Python中调用API,可以帮助我们轻松地获取数据,并将其整合到我们…

【Spring Cloud 四】Ribbon负载均衡

Ribbon负载均衡 系列文章目录背景一、什么是Ribbon二、为什么要有Ribbon三、使用Ribbon进行负载均衡服务提供者A代码pom文件yml配置文件启动类controller 服务提供者Bpom文件yml配置文件启动类controller 服务消费者pom文件yml文件启动类controller 运行测试 四、Ribbon的负载均…

0140 数据链路层2

目录 3.数据链路层 3.6局域网 3.7广域网 3.8数据链路层设备 部分习题 3.数据链路层 3.6局域网 3.7广域网 3.8数据链路层设备 部分习题 1.如果使用5类UTP来设计一个覆盖范围为200m的10BASE-T以太网,需要采用的设备是() A.放大器 …

Selenium入门详细教程+实例演示

目录 1.Selenium概述 1.1什么是Selenium 1.2Selenium的优势 1.3Selenium WebDriver原理 2.Selenium环境搭建 3.Selenium 简单示例 4.八大元素定位 4.1定位方式 4.2定位方式的用法 5.Selenium API 5.1WebDriver 常用 API 5.2WebElement 常用 API 5.3代码示例 6.元素等待机…

阿里云瑶池 PolarDB 开源官网焕新升级上线

导读近日,阿里云开源云原生数据库 PolarDB 官方网站全新升级上线。作为 PolarDB 开源项目与开发者、生态伙伴、用户沟通的平台,将以开放、共享、促进交流为宗旨,打造开放多元的环境,以实现共享共赢的目标。 立即体验全新官网&…

【华秋推荐】物联网入门学习模块 ESP8266

随着全球信息技术的不断进步和普及,物联网成为当今备受关注的技术热点之一。通过物理和数字设备之间的连接来实现自动化和互联互通的网络。无线传感器、云计算和大数据分析等技术,物联网使设备能够相互交流和共享信息,实现智能化的自动化操作…

.Net6 Core Web API 配置 log4net + MySQL

目录 一、导入NuGet 包 二、添加配置文件 log4net.config 三、创建MySQL表格 四、Program全局配置 五、帮助类编写 六、效果展示 小编没有使用依赖注入的方式。 一、导入NuGet 包 ---- log4net 基础包 ---- Microsoft.Extensions.Logging.Log4Net…

K8s集群安全机制

1.访问K8s集群的时候,需要经过三个步骤完成具体操作 (1)认证(2)鉴权(授权)(3)准入控制 进行访问的时候,过程中都要经过apiserver,apiserver做统…

Android中的Webview 加载优化

Android中的Webview 加载优化 在Android中,WebView是用于在应用中展示网页内容的组件。由于网页内容可能包含大量的资源和复杂的页面结构,WebView的加载性能优化至关重要,以提高网页加载速度、节省流量和提升用户体验。以下是一些常用的WebV…

Docker与DevOps的无敌组合,引爆你的创新潜能

🏆荣誉认证:51CTO博客专家博主、TOP红人、明日之星;阿里云开发者社区专家博主、技术博主、星级博主。 💻微信公众号:iOS开发上架 📌本文由iOS开发上架原创! 🎉欢迎关注🔎…

【网络编程·传输层】UDP和TCP的报头

目录 一、端口号划分 二、部分指令 1、pidof(用于查看进程id) 2、netstat(查看网络状态) 三、UDP协议 1、UDP协议格式 2、UDP协议如何进行封装、解包、分用 2.1封装、解包 2.2分用 3、UDP协议的特点 3.1UDP协议的特点 …

C# 控制台彩色深度打印 工具类

文章目录 前言Nuget 环境安装代码使用打印结果 总结 前言 有时候我们想要靠打印获得程序信息,因为Dubeg模式需要一点一点断点进入进出,但是我们觉得断点运行实在是太慢了,还是直接打印后找结果会好一点。 Nuget 环境安装 想自己写的话可以看…

Android Studio API 33 获取当前连接的WIFI名称

常规流程失败流程 常规流程 以下内容在 API 33 成功实现&#xff0c;低版本API还请自行尝试&#xff08;仅推荐 API 29 - 33 用户食用&#xff09; 先&#xff08;至少&#xff09;添加以下权限到你的 AndroidManifest.xml 文件 <uses-permission android:name"andr…

试卷去手写内容在线擦除,使用这个方法轻松达成

在数字时代&#xff0c;越来越多的人开始使用电子设备来完成日常任务。即使在考试时&#xff0c;许多学生也选择使用电子设备来写答案&#xff0c;而不是在试卷上手写。然而&#xff0c;有时候我们需要手写答案&#xff0c;但当我们想要更改或者擦除时&#xff0c;这将是一个麻…

【ES】笔记-模板字符串(template string)是增强版的字符串`${expresions}`

模板字符串 传统的 JavaScript 语言&#xff0c;输出模板通常是这样写的&#xff08;下面使用了 jQuery 的方法&#xff09;。 $(#result).append(There are <b> basket.count </b> items in your basket, <em> basket.onSale </em> are on sal…

TypeScript 类型断言

TypeScript 类型断言 简单来说类型断言就是 使用as关键词 强行指定获取到的结果类型 应用场景 // 类型断言: 强行指定获取到的结果类型// 应用场景// 页面上有一个 id 为 link 的 a 标签// 我们知道它是 a 标签// 但是 TS 不知道 // document.getElementById 的返回值是 HTMLE…

区块链实验室(17) - FISCO BCOS的P2P网络层分析

首先启动FISCO BCOS的示例网络&#xff0c;即4个节点的强连通网络。每个节点与其余3个节点存在网络连接。 打开控制台&#xff0c;可以看到当前有21个区块。 其中1个节点的P2P端口是30301&#xff0c;监测这个节点的端口。 该端口的部分流量见下图所示。白底部分是某1秒钟接收到…

f12 CSS网页调试_css样式被划了黑线怎么办

我的问题是这样的 class加上去了,但是样式不生效,此时可能是样式被其他样式覆盖了, 解决方案就是 给颜色后边添加一个!important