Java 后端实现基于 JWT 的用户认证和权限校验(含代码讲解)

Java中JWT技术解析与实践:安全高效的身份认证 身份认证与授权是现代Web应用中至关重要的安全机制。JSON Web Token(JWT)作为一种轻量级的身份验证方案,已经成为Java开发中广泛使用的解决方案。本篇博客将深入解析JWT技术,探讨其在Java应用中的实践与应用。我们将了解JWT的基本原理,以及它如何实现安全高效的身份认证和授权。通过使用JWT,我们可以在无状态的分布式系统中实现简单且可扩展的用户身份验证,不再依赖传统的Session和Cookie。我们还将探讨如何在Java中集成JWT,以及如何将其应用于实际项目中。让我们一起深入探索JWT 阅读详情

在前后端分离的项目中,JWT(JSON Web Token) 是一种非常流行的用户认证机制。相比传统的 Session,JWT 更加轻量、易扩展,特别适合前后端分离、移动端 API 场景。

今天我们基于 Spring Boot + JWT,完整实现一套 登录生成 Token + 认证拦截器校验 Token 的流程,并附完整示例代码,助你轻松上手。


📌 项目背景

  • 技术栈:Spring Boot + MyBatis + JWT

  • 功能目标:

    • 用户登录,生成 Token

    • 后续请求带 Token 自动鉴权

    • 无需 Session,支持跨服务调用


🧩 一、登录接口:生成 JWT Token

@PostMapping("/login")
public ResponseEntity<?> login(@RequestBody Map<String, String> loginRequest) {
    String username = loginRequest.get("username");
    String password = loginRequest.get("password");

    // 1. 数据库查用户
    QueryWrapper<User> queryWrapper = new QueryWrapper<>();
    queryWrapper.eq("username", username);
    User user = userMapper.selectOne(queryWrapper);

    if (user == null) {
        return ResponseEntity.status(HttpStatus.UNAUTHORIZED).body("用户名不存在");
    }

    // 2. 验证密码
    if (!passwordEncoder.matches(password, user.getPassword())) {
        return ResponseEntity.status(HttpStatus.UNAUTHORIZED).body("密码错误");
    }

    // 3. 登录成功,生成 JWT
    String token = JwtUtils.generateToken(user); // 👈 自定义工具类

    Map<String, String> response = new HashMap<>();
    response.put("token", token);
    response.put("message", "登录成功");
    return ResponseEntity.ok(response);
}
  • 登录成功后,前端拿到 token,后续请求都通过请求头 Authorization: Bearer <token> 携带。


🔑 二、JWT 工具类(JwtUtils)

public class JwtUtils {

    private static final String SECRET_KEY = "your-secret-key";
    private static final long EXPIRATION_TIME = 3600000; // 1 小时

    // 生成 Token
    public static String generateToken(User user) {
        return Jwts.builder()
                .setSubject(user.getUsername())
                .claim("role", user.getRole()) // 可扩展更多字段
                .setIssuedAt(new Date())
                .setExpiration(new Date(System.currentTimeMillis() + EXPIRATION_TIME))
                .signWith(SignatureAlgorithm.HS256, SECRET_KEY)
                .compact();
    }

    // 解析 Token
    public static Claims parseToken(String token) {
        return Jwts.parser()
                .setSigningKey(SECRET_KEY)
                .parseClaimsJws(token)
                .getBody();
    }
}

🧱 三、JWT 认证过滤器:拦截每个请求校验 Token

public class JwtAuthenticationFilter implements Filter {

    private static final String SECRET_KEY = "your-secret-key";

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {

        HttpServletRequest httpRequest = (HttpServletRequest) request;
        String token = getTokenFromRequest(httpRequest);

        System.out.println("JWT token: " + token); // ✅ 打印调试

        if (StringUtils.hasText(token)) {
            try {
                Claims claims = Jwts.parser()
                        .setSigningKey(SECRET_KEY)
                        .parseClaimsJws(token)
                        .getBody();

                String username = claims.getSubject();
                String role = claims.get("role", String.class);

                UsernamePasswordAuthenticationToken authentication =
                        new UsernamePasswordAuthenticationToken(
                                username,
                                null,
                                Collections.emptyList() // 可以配置权限
                        );

                authentication.setDetails(new WebAuthenticationDetailsSource().buildDetails(httpRequest));
                SecurityContextHolder.getContext().setAuthentication(authentication);

            } catch (Exception e) {
                System.out.println("JWT解析失败: " + e.getMessage());
            }
        }

        chain.doFilter(request, response);
    }

    private String getTokenFromRequest(HttpServletRequest request) {
        String bearerToken = request.getHeader("Authorization");
        if (StringUtils.hasText(bearerToken) && bearerToken.startsWith("Bearer ")) {
            return bearerToken.substring(7); // 去掉 Bearer 前缀
        }
        return null;
    }
}

🧠 拦截器作用:

  • 自动从请求头解析 Token

  • 校验签名、过期时间

  • 如果合法,向 Spring Security 注入 Authentication 对象,代表当前用户已认证


⚙️ 四、注册过滤器(Spring Security 环境)

如果使用 Spring Security,可以将 JwtAuthenticationFilter 注册到过滤链中:

@Configuration
public class SecurityConfig {

    @Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
        return http
                .csrf(csrf -> csrf.disable())
                .authorizeHttpRequests(auth -> auth
                    .antMatchers("/login").permitAll()
                    .anyRequest().authenticated()
                )
                .addFilterBefore(new JwtAuthenticationFilter(), UsernamePasswordAuthenticationFilter.class)
                .build();
    }
}

📋 五、前端如何携带 Token 请求

前端登录后,拿到后端返回的 token,之后的所有请求都加上请求头:

axios.get('/api/user/info', {
  headers: {
    Authorization: 'Bearer ' + token
  }
})

如果你用的是 Fetch:

fetch('/api/user/info', {
  headers: {
    'Authorization': 'Bearer ' + token
  }
});

✅ 最终效果演示

  1. 调用 /login,返回:

{
  "token": "eyJhbGciOiJIUzI1NiIsInR...",
  "message": "登录成功"
}
  1. 访问需要认证的接口,如 /user/info,带上 token,返回成功数据。

  2. 如果 token 错误或过期,会被过滤器拦截,返回未认证提示。


✍️ 总结

步骤内容
1️⃣登录成功生成 JWT
2️⃣前端保存 token 并携带请求
3️⃣后端过滤器拦截校验 JWT
4️⃣注入认证信息,实现无状态登录

🎁 附加建议:

  • 可以使用 Redis 存储 Token 黑名单,实现退出登录/踢人下线。

  • 生产环境务必设置合适的 Token 过期时间、密钥强度。

  • 登录成功返回 token 的同时,也可以返回用户信息。


📌 如果你觉得这篇文章对你有帮助,欢迎点赞 + 收藏 + 关注!我会持续更新更多 Java 项目实战和技术干货。

Java实现JWT认证的完整指南:如何从零开始构建安全认证系统 JWT是一种基于JSON的开放标准,用于在各方之间作为JSON对象安全地传输信息。它特别适合于在无状态环境中(如RESTful API)进行身份验证和信息交换。通过以上步骤,我们成功地在Java中实现了基于JWT的身份认证系统。这个系统具有高度的安全性和扩展性,适用于各种需要身份认证的应用场景。希望这篇文章对大家有所帮助,如果你觉得这篇文章对你有所帮助,欢迎关注我的博客。未来,我会继续分享更多关于Java开发的干货。让我们一起在技术的道路上不断探索,勇往直前! 阅读详情

相关推荐

在Java Spring Boot中使用JWT进行用户认证

在我们的例子中,我们创建了一个叫做JwtUtils的工具类,它包含了生成和解析JWT的方法。代码如下://生成JWT令牌.compact();return jwt;//解析JWT令牌.getBody();在JwtUtils类中,我们使用Jwts类提供的方法来生成和解析JWT。方法接收一个包含你要在JWT中包含的信息的Map对象作为参数,然后使用来构造一个JWT。这个JWT会使用HS256算法和预先定义好的签名密钥进行签名。parseJWT方法接收一个JWT字符串作为参数,然后使用。

weixin_53027065的博客 525

Java实现JWT登录认证

JWT(Json Web Token),简单来说就是:web领域中基于json格式的令牌。是最常用的令牌规范。第一部分:Header(头),指定了令牌的签名算法、令牌类型。第二部分:Payload(有效载荷),使用Base64来编码的,不是加密算法,能够解码。因此,该部分不适合存放用户的私密信息(如:密码)。第三部分:Signature(签名),将第一部分和第二部分通过密钥加密得到。解析Token可以根据第三部分解密得到前两部分的信息,再比对前端传来的用户信息,完成校验。

qq_45480682的博客 1442

jwt结合shiro实现认证和权限控制,非常详细

文章目录前期准备1. 导入依赖2. 编写JwtUtil类3. 封装token4. 编写JWT的过滤器5. 编写shiro的自定义Realm对象6. 编写shiro配置文件7. 捕获shiro异常8. 编写controller1.登录接口2.用户接口9.测试结果 前期准备 jwt,我的理解就是可以进行客户端与服务端之间验证的一种技术,取代了之前使用Session来验证的不安全性。为什么不适用Session? 原理是,登录之后客户端和服务端各自保存一个相应的SessionId,每次客户端发起请求的时候就得携带

zhuzi的博客 1万+

java系列之JWT权限验证

​ cookie和session的缺点: ​ session都存储在服务端的内存 ​ 集群环境中需要额外处理 ​ csrf :cookie被截取后可能发生跨站点请求伪造 ​ cookie的跨域读写不方便

m0_61027348的博客 5163

springboot+JWT+shiro实现认证及权限校验

1.项目环境 jdk:8 springboot:1.5.10 2.搭建项目管理 新建springboot项目,引入如下依赖 <dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-spring</artif...

yuan_liang2的博客 2万+

Springboot +JWT实现登录认证,密码加密及Token校验全过程(附源码)

JWT实现登录认证简介环境1. 依赖2. token生成及校验3. 登录4. 编写拦截器进行token校验5. 源码下载 简介 通俗地说,JWT的本质就是一个字符串,它是将用户信息保存到一个Json字符串中,然后进行编码后得到一个JWT token,并且这个JWT token带有签名信息,接收后可以校验是否被篡改,所以可以用于在各方之间安全地将信息作为Json对象传输。JWT的认证流程如下: 首先,前端通过Web表单将自己的用户名和密码发送到后端的接口,这个过程一般是一个POST请求。建议的方式是通

dingdingdandan 1万+

springboot+jwt实现token登陆权限认证

一 前言 此篇文章的内容也是学习不久,终于到周末有时间码一篇文章分享知识追寻者的粉丝们,学完本篇文章,读者将对token类的登陆认证流程有个全面的了解,可以动态搭建自己的登陆认证过程;对小项目而已是个轻量级的认证机制,符合开发需求;更多精彩原创内容关注公主号知识追寻者,读者的肯定,就是对作者的创作的最大支持; 二 jwt实现登陆认证流程 用户使用账号和面发出post请求 服务器接受到请求后使用私...

知识追寻者(Inheriting the spirit of open source, Spreading technology knowledge;) 1万+

shiro之前后端分离(基于jwt的token安全认证)

前后端分离项目与传统的一体式项目有所不同,用户安全验证的方式不太一样,前后端分离项目不能像一体式项目那样使用session验证,所以一般使用token验证。废话不多说,直接上代码。 主要代码: 一、JwtUtil Jwt即java web token,是比较成熟的token方案,JwtUtil里面有生成token的方法、校验token是否有效是否过期的方法、以及通过token获取解析值的方法,这里我们可以设置token的有效时间。 @Component public class JwtUtil {

weixin_45390688的博客 6385

SpringCloud gateway+Spring Security + JWT实现登录和用户权限校验

使用SpringCloud gateway与Spring Security以及JWT,在前后端分离情况下的用户统一认证授权

yuan__once的博客 1万+

整合SpringSecurity和JWT实现登录认证和授权

文章目录前言一、SpringSecurity是什么?二、JWT是什么?1. JWT的组成2. JWT实现认证和授权的原理三、整合步骤1. 引入相关依赖2. yml配置中加入jwt配置信息3. 添加JWT token的工具类4. 添加SpringSecurity的配置类5. 添加自定义结果处理类5.1 添加CustomAccessDeniedHandler5.2 添加CustomAuthenticationEntryPoint6. 添加JwtUser类7. 添加过滤器JwtAuthenticationTok

Java升级之路的博客 5179

用户登录认证和权限授权(SpringSecurity、JWT、session)

登录认证和权限授权是所有项目中必不可少的功能,本篇文章首先将通过最简单的方式(Session和JWT)实现登录认证和权限授权,然后再整合Springsecurity框架实现。Web系统中登录认证(Authentication)的核心就是凭证机制,无论是Session还是JWT,都是在用户成功登录时返回给用户一个凭证,后续用户访问接口需携带凭证来标明自己的身份。权限授权(Authorization)是对用户能否访问某个资源进行确认,这种通用逻辑都是放在过滤器里进行的统一操作。

m0_74824823的博客 1365

SpringBoot整合Shiro+JWT实现认证及权限校验

本文讲解如何使用`SpringBoot`整合`Shiro`框架来实现认证及权限校验,但如今的互联网已经成为前后端分离的时代,所以本文在使用`SpringBoot`整合`Shiro`框架的时候会联合`JWT`一起搭配使用。

花伤情犹在的博客 1万+

Flink实战项目——城市交通实时监控平台

本项目是与公安交通管理综合应用平台、机动车缉查布控系统等对接的,并且基于交通部门现有的数据平台上,进行的数据实时分析项目。

yangwei2048的博客 837

【Java项目安全基石】登录认证实战:Session/Token/JWT用户校验机制深度解析

登录认证是系统安全的门户,而会话的持续管理策略直接影响开发效率与系统健壮性。许多开发者在实践中常陷入困惑: 为何Session在集群部署时突然失效? Token与JWT看似相似,核心差异究竟在哪? 如何避免常见的安全陷阱? 本文针对主流场景,从底层原理剖析Session、Token、JWT三大用户校验方案,结合Java代码实现与安全规范,详解其工作机制、适用边界及落地要点。无论您是构建传统Web应用还是前后端分离项目,均可获得可直接复用的实践方案。

2301_81073317的博客 2628

二维码扫描与页面跳转的完整流程解析

本文详细解析了二维码扫描与页面跳转的完整流程,从核心原理到前后端实现,涵盖了二维码生成、扫码事件处理、后端验证机制及跳转逻辑等关键环节。特别介绍了如何使用qrcode.js生成二维码、WebSocket处理扫码状态以及JWT令牌验证设计,帮助开发者构建安全高效的扫码跳转系统。

cicd6pipeline的博客 1089

千兆以太网的接收和crc校验

解析该以太网帧,包括统计该以太网帧长度+过滤功能(端口号对不对,是否为udp协议)+CRC校验,将解析结果存入状态fifo,一旦状态fifo开始有数,就开始开启读过程,读过程开始时,首先读状态fifo,根据从状态fifo里面读出的以太网帧长度,来读数据fifo(这样能够防止跨帧读),然后在根据状态fifo里面读出的crc校验正确标志和过滤标志,来确定是否将数据fifo读出来的数据送给下一个模块。改掉之后在抓一下,可以看到抓出来的数据完全正确,从最后开始看,除去4个crc校验的尾巴,数据是到255结束的。

weixin_45284871的博客 2738

Springboot+Spring-Security+JWT 实现用户登录和权限认证

Spring Boot 项目初始化:利用 Spring Initializr 创建项目,并添加必要依赖(Spring Web、Spring Security、JWT、JPA 等)。 用户登录和注册接口:实现 AuthController,处理用户登录请求,并返回 JWT。 Spring Security 配置:通过扩展 WebSecurityConfigurerAdapter 来配置 Spring Security,设置无状态的会话管理、JWT 过滤器、受保护的资源路径等。 JWT 生成和解析:实现。

yuwinter的博客 4303

【学习笔记】计算机网络 第八章 无线局域网(WLAN)

计算机网络 第八章 无线局域网(WLAN)

Vera_shsf的博客 1243

SpringSecurity和JWT实现认证和授权

整合SpringSecurity和JWT实现认证和授权

OlderSheep编程达人 2347

C# 上位机高级功能实战:报警、历史回放与远程监控

本文介绍了工业上位机系统的高级功能实现,主要包括实时报警机制、历史数据回放和远程监控三部分。报警功能通过阈值检测实现异常提醒;历史回放利用数据库存储数据,通过定时器控制回放进度;远程监控提供TCP、WebSocket等多种数据传输方式。文章还给出了综合优化建议,如异步处理、报警去抖动等,最终形成一个包含数据采集、显示、存储、报表及高级功能的完整工业自动化闭环系统。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 751

基于 YOLOv26 的电路焊点虚焊检测系统:AI 质检实战

本文介绍了一种基于YOLOv26的电路焊点虚焊检测系统,利用深度学习技术实现自动化质检。系统能识别虚焊、桥接、少锡等8种常见焊点缺陷,具有高精度、实时性和强鲁棒性等特点。文章详细阐述了系统架构,包括数据采集、预处理、YOLOv26检测模型和后处理模块,并提供了代码实现的关键部分,如数据预处理增强和模型训练配置。该系统可显著提高电子制造业的质检效率和准确性。

一键难忘的博客 692

【前后端分离】Spring Security + Redis + JWT 实现动态权限管理

项目环境 本篇文章环境:Spring Boot + Mybatis + Spring Security + Redis + JWT 预期成果:实现具有验证码校验、RBAC 权限控制的前后端分离项目 注意:为什么要使用 Json Web Token(JWT)?这是因为前后端分离项目中,前端与后端之间的通信采用 RESTFul API 的交互方式进行交互。这种前后端分离的交互是无状态的交互方式,所以,每次交互都必须进行身份验证。而传统方案是根据用户信息生成token,将token 存入浏览器 cookie(或存

人生何事不浮云 5221

YOLOv11改进 | 添加注意力篇 | 一文带你改进GAM、CBAM、CA、ECA等通道注意力机制和多头注意力机制

这篇文章给大家带来的改进机制是一个汇总篇,包含一些简单的注意力机制,本来一直不想发这些内容的(网上教程太多了,发出来增加文章数量也没什么意义),但是群内的读者很多都问我这些机制所以单独出一期视频来汇总一些比较简单的注意力机制添加的方法和使用教程,本文的内容不会过度的去解释原理,更多的是从从代码的使用上和实用的角度出发去写这篇教程。欢迎大家订阅我的专栏一起学习YOLO!YOLOv11改进系列专栏——本专栏持续复习各种顶会内容——科研必备目录一、本文介绍二、GAM2.1 GAM的介绍2.2 GAM的核心代码。

Snu77的博客 5152

JWT 在前后端分离架构中的用户认证与权限控制方案详解

JWT作为轻量级的跨语言认证方案,由Header、Payload和Signature三部分组成,具有无状态、可扩展和跨平台特性。文章以Java为例展示了JWT的生成与校验流程,并对比了两种典型应用方案:统一网关认证(适合低并发系统)和业务应用内认证(适合高并发系统)。最后提出了安全性提升建议,包括使用HTTPS、设置合理过期时间和避免敏感信息存储。JWT是现代分布式系统中实现安全高效认证机制的主流解决方案。

qq_46371374的博客 822

字符串尾部空格的迷思:深入解析 ABAP 隐式转换规则与 `strlen` 意外结果

看似简单的strlen之谜,背后实则是 ABAP 隐式转换的一整套严谨规则。只要开发者在赋值、输出、接口映射等关键节点建立“尾部空格意识”,辅以CONVCONDENSE等显式手段,就能有效杜绝多余空格引发的链式故障。希望本文的拆解与案例,能让你在面对下一个“异常长度”时,从容而笃定地给出正确答案。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 431

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

SpringSecurity (3) SpringBoot + JWT 实现身份认证和权限验证

本篇将介绍 SpringSecurity 结合 JWT (Json Web Token) 实现身份认证和权限验证.

O_o 5638

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

上一篇: 在 Ruoyi 项目中如何解决跨域问题(CORS)
下一篇: 一个五分钟的倒计时,我调了一周
Alan52519
博客等级 码龄6年 40粉丝 12原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值