Java Web开发实战与项目——用户认证与授权模块开发
Web应用中,用户认证与授权是至关重要的功能,确保只有合法用户才能访问受保护的资源。Spring Security作为一个强大的安全框架,支持多种认证与授权方式。在本章节中,我们将深入探讨三种常见的用户认证与授权方案:基于Token的用户认证(JWT)、OAuth2认证与授权,以及使用Spring Security与OAuth2实现社交登录。
1. 实现基于Token的用户认证(JWT)
1.1 什么是JWT
JWT(JSON Web Token)是一种基于Token的认证机制,广泛应用于分布式系统中。它通常由三部分组成:
- Header:通常包含Token类型和加密算法的信息。
- Payload:包含用户的身份信息及相关的元数据(如角色)。
- Signature:用于验证JWT的真实性,通常使用秘钥进行加密。
JWT的优势在于它是无状态的,也就是说,服务器不需要存储会话信息,所有信息都包含在JWT中。这使得它非常适用于微服务架构和分布式系统。
1.2 JWT认证流程
- 用户登录时,提交用户名和密码。
- 服务器验证用户信息,通过验证后生成JWT。
- 将JWT返回给客户端,客户端保存Token。
- 客户端在后续请求中,将Token附加在HTTP请求的Authorization头部中,服务器通过解密Token来验证用户身份。
1.3 使用Spring Boot实现JWT认证
- 添加依赖
在pom.xml中添加JWT相关依赖:
<dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt</artifactId><version>0.11.5</version>
</dependency>
生成JWT的工具类
创建一个JWT生成工具类,用于生成和解析JWT。
@Component
public class JwtTokenUtil {private String secretKey = "secret"; // 秘钥,应该放在配置文件中private long expirationTime = 86400000L; // 过期时间,24小时// 生成JWTpublic String generateToken(String username) {Date now = new Date();Date expiryDate = new Date(now.getTime() + expirationTime);return Jwts.builder().setSubject(username).setIssuedAt(now).setExpiration(expiryDate).signWith(SignatureAlgorithm.HS512, secretKey).compact();}// 从JWT中解析出用户名public String getUsernameFromToken(String token) {return Jwts.parser().setSigningKey(secretKey).parseClaimsJws(token).getBody().getSubject();}// 验证JWT是否有效public boolean validateToken(String token, String username) {String parsedUsername = getUsernameFromToken(token);return (parsedUsername.equals(username) && !isTokenExpired(token));}// 判断JWT是否过期private boolean isTokenExpired(String token) {Date expiration = Jwts.parser().setSigningKey(secretKey).parseClaimsJws(token).getBody().getExpiration();return expiration.before(new Date());}
}
认证过滤器
创建一个过滤器,用于在每个请求中验证JWT。
@Component
public class JwtAuthenticationFilter extends OncePerRequestFilter {@Autowiredprivate JwtTokenUtil jwtTokenUtil;@Overrideprotected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)throws ServletException, IOException {String token = request.getHeader("Authorization");if (token != null && token.startsWith("Bearer ")) {token = token.substring(7);String username = jwtTokenUtil.getUsernameFromToken(token);if (username != null && SecurityContextHolder.getContext().getAuthentication() == null) {UsernamePasswordAuthenticationToken authentication =new UsernamePasswordAuthenticationToken(username, null, new ArrayList<>());SecurityContextHolder.getContext().setAuthentication(authentication);}}filterChain.doFilter(request, response);}
}
用户认证与生成Token
在用户登录时,生成JWT并返回给客户端。
@RestController
public class AuthController {@Autowiredprivate JwtTokenUtil jwtTokenUtil;@PostMapping("/login")public ResponseEntity<?> createAuthenticationToken(@RequestBody AuthenticationRequest authenticationRequest) {// 验证用户身份if ("user".equals(authenticationRequest.getUsername()) && "password".equals(authenticationRequest.getPassword())) {String token = jwtTokenUtil.generateToken(authenticationRequest.getUsername());return ResponseEntity.ok(new AuthenticationResponse(token));}return ResponseEntity.status(HttpStatus.UNAUTHORIZED).body("Invalid credentials");}
}
1.4 保护资源
在需要保护的资源上使用@PreAuthorize或@Secured注解来进行权限控制。
@RestController
@RequestMapping("/admin")
public class AdminController {@GetMapping("/dashboard")@PreAuthorize("hasRole('ADMIN')")public String getAdminDashboard() {return "Admin Dashboard";}
}
2. 配置OAuth2认证与授权
2.1 什么是OAuth2
OAuth2是一个授权框架,用于让第三方应用访问用户资源而无需暴露用户的用户名和密码。OAuth2通过授权码、密码、客户端凭证等不同方式来获取Token,常见的应用场景包括社交登录和API访问。
2.2 配置OAuth2认证
在Spring Boot中,OAuth2认证可以通过spring-security-oauth2-client和spring-security-oauth2-jose等库来配置。
添加依赖
在pom.xml中添加OAuth2的相关依赖:
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-oauth2-client</artifactId>
</dependency>
配置application.yml
在application.yml中配置OAuth2客户端信息,如以下示例配置Google OAuth2登录:
spring:security:oauth2:client:registration:google:client-id: YOUR_GOOGLE_CLIENT_IDclient-secret: YOUR_GOOGLE_CLIENT_SECRETscope:- profile- emailredirect-uri: "{baseUrl}/login/oauth2/code/{registrationId}"authorization-grant-type: authorization_codeclient-name: Googleprovider:google:authorization-uri: https://accounts.google.com/o/oauth2/authtoken-uri: https://oauth2.googleapis.com/tokenuser-info-uri: https://www.googleapis.com/oauth2/v3/userinfo
OAuth2登录处理
Spring Boot自动处理OAuth2登录过程。您只需配置相关的OAuth2提供商(如Google、GitHub等),并在应用中使用@EnableOAuth2Sso注解来开启社交登录。
@SpringBootApplication
@EnableOAuth2Sso
public class OAuth2Application {public static void main(String[] args) {SpringApplication.run(OAuth2Application.class, args);}
}
3. 使用Spring Security与OAuth2实现社交登录
3.1 社交登录简介
社交登录(Social Login)是指通过已有的社交媒体账户(如Google、Facebook、GitHub等)进行身份验证的方式。通过OAuth2协议,用户无需在每个应用中注册单独的账户,只需使用现有的社交账户登录。
3.2 配置社交登录
配置第三方OAuth2登录
以GitHub为例,在application.yml中配置GitHub OAuth2客户端:
spring:security:oauth2:client:registration:github:client-id: YOUR_GITHUB_CLIENT_IDclient-secret: YOUR_GITHUB_CLIENT_SECRETscope: read:userredirect-uri: "{baseUrl}/login/oauth2/code/{registrationId}"authorization-grant-type: authorization_codeclient-name: GitHubprovider:github:authorization-uri: https://github.com/login/oauth/authorizetoken-uri: https://github.com/login/oauth/access_tokenuser-info-uri: https://api.github.com/user
自定义用户信息
在OAuth2UserService中,您可以自定义如何从OAuth2提供商获取用户信息。
@Service
public class CustomOAuth2UserService extends DefaultOAuth2UserService {@Overridepublic OAuth2User loadUser(OAuth2UserRequest userRequest) throws OAuth2AuthenticationException {OAuth2User user = super.loadUser(userRequest);// 在此可以从user中获取用户信息并存储到数据库return user;}
}
社交登录成功后的回调处理
使用Spring Security的默认OAuth2登录机制,用户登录成功后会自动跳转到指定的成功页面,您可以在SecurityConfig中自定义成功和失败的处理:
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {@Overrideprotected void configure(HttpSecurity http) throws Exception {http.oauth2Login().loginPage("/login").successHandler(new OAuth2LoginSuccessHandler()).failureHandler(new OAuth2LoginFailureHandler());}
}
3.3 完成社交登录
通过以上配置,您已经成功集成了OAuth2社交登录,支持用户通过Google、GitHub等社交账户进行登录。
总结
本文详细介绍了基于Token的用户认证(JWT)、OAuth2认证与授权的配置与实现,以及如何使用Spring Security与OAuth2实现社交登录。通过这些技术,我们可以实现灵活且安全的认证与授权机制,并有效地支持分布式应用和微服务架构中的用户管理。
关于作者:
15年互联网开发、带过10-20人的团队,多次帮助公司从0到1完成项目开发,在TX等大厂都工作过。当下为退役状态,写此篇文章属个人爱好。本人开发期间收集了很多开发课程等资料,需要可联系我

相关文章:
Java Web开发实战与项目——用户认证与授权模块开发
Web应用中,用户认证与授权是至关重要的功能,确保只有合法用户才能访问受保护的资源。Spring Security作为一个强大的安全框架,支持多种认证与授权方式。在本章节中,我们将深入探讨三种常见的用户认证与授权方案:基于To…...
力扣每日一题【算法学习day.129】
前言 ###我做这类文章一个重要的目的还是记录自己的学习过程,我的解析也不会做的非常详细,只会提供思路和一些关键点,力扣上的大佬们的题解质量是非常非常高滴!!! 习题 1.数组列表中的最大距离 题目链接…...
uni-app发起网络请求的三种方式
uni.request(OBJECT) 发起网络请求 具体参数可查看官方文档uni-app data:请求的参数; header:设置请求的 header,header 中不能设置 Referer; method:请求方法; timeout:超时时间,单位 ms&a…...
字节火山云DeepSeek接入教程,支持联网,速度超快。
大家好,我是苍何。 在使用 DeepSeek 官网,实在是卡的我差点学猪叫,于是我一直在寻找替代方案。 要求就 2:满血,速度快。(当然能联网更好)。 我也一度使用了如硅基流动 API,发现也开…...
C语言指针学习笔记
1. 指针的定义 指针(Pointer)是存储变量地址的变量。在C语言中,指针是一种非常重要的数据类型,通过指针可以直接访问和操作内存。 2. 指针的声明与初始化 2.1 指针声明 指针变量的声明格式为:数据类型 *指针变量名…...
FreeRTOS-rust 编译分析
目录介绍 FreeRTOS-rust ├── .cargo # 对 cargo 本身的配置 │ └── config.toml ├── Cargo.toml # 对当前工作空间的配置 ├── freertos-cargo-build # 负责对 freertos 源码进行编译 │ ├── Cargo.toml # 对当前 package 进行配置 │ └…...
【解决方法】vite-plugin-svg-icons使用中出现问题[vite] Cannot find package ‘fast-glob‘
问题长这样: 参考文章:https://medium.com/wumeng9028/vite-plugin-svg-icons-error-cannot-find-package-fast-glob-8cb03d19c0ac 解决方法:pnpm add fast-glob -D package.json {"vite-plugin-svg-icons": "2.0.1"…...
[Qt] 使用QUndoStack运行到cmd->isObsolete()崩溃
redo/undo中又push了 崩溃情况崩溃原因解决方法 崩溃情况 在正常调用QUndoStack的redo/undo时,崩溃在了这里 unknown:0 QWidget: Cannot create a QWidget without QApplication. 崩溃原因 在正常调用QUndoStack的redo/undo时,因为自身的逻辑处理&a…...
大白话实战Sentinel
Sentinel是SpringCloudAlibaba提供的用来做服务保护的框架,而服务保护的常见手段就是限流和熔断降级。在大型分布式系统里面,由于微服务众多,所以服务之间的稳定性需要做特别关注,Sentinel的核心包就提供了从多个维度去保护服务稳定的策略,而且这些保护策略都可以连接上Se…...
DL/CV领域常见指标术语(FLOPS/mIoU/混淆矩阵/F1-measure)------一篇入门
1. FLOPS、FLOPs和GFLOPs FLOPS: floating-point operations per second,每秒浮点运算次数,用来衡量硬件性能。 FLOPs:floating point of operations,是浮点运算次数,用来衡量算法、模型的复杂度。 GFLOPSÿ…...
SprutCAMX16数控软件介绍
SprutCAM X 16 是一款功能强大的CAM(计算机辅助制造)软件,专为数控机床编程和制造过程优化设计。它广泛应用于机械加工、模具制造、3D打印等领域,支持多轴加工、车铣复合、机器人加工等多种加工方式。以下是SprutCAM X 16的主要特…...
Miniconda + VSCode 的Python环境搭建
目录: 安装 VScode 安装 miniconda 在VScode 使用conda虚拟环境 运行Python程序 1.安装 vscode 编辑器 官网链接:Visual Studio Code - Code Editing. Redefined 下载得到:,双击安装。 安装成功…...
TRELLIS 部署笔记
目录 依赖项安装 kaolin安装: 安装和运行报错解决 u2net.onnx 下载 解决方法,就是自行下载,然后拷贝到目录/root/.u2net bash测试u2net: 报错GaussianRasterizationSettings.__new__() got an unexpected keyword argument…...
深入解析Qt事件循环
在Qt开发中,QApplication::exec()这行代码是每个开发者都熟悉的“魔法咒语”。为什么GUI程序必须调用它才能响应操作?为何耗时操作会导致界面冻结?本文将以事件循环为核心,揭示Qt高效运转的底层逻辑,探讨其设计哲学与最…...
Visual Studio Code 集成 Baidu Comate
文章目录 安装Baidu Comate插件 安装Baidu Comate插件 从左主侧栏中 点击 【扩展】这个图标,然后在上方输入栏中输入 baidu comate —>选中列出的Bai Comate —>点击 【安装】按钮,等待安装完毕…...
「正版软件」PDF Reader - 专业 PDF 编辑阅读工具软件
PDF Reader 轻松查看、编辑、批注、转换、数字签名和管理 PDF 文件,以提高工作效率并充分利用 PDF 文档。 像专业人士一样编辑 PDF 编辑 PDF 文本 轻松添加、删除或修改 PDF 文档中的原始文本以更正错误。自定义文本属性,如颜色、字体大小、样式和粗细。…...
Kafka消息服务之Java工具类
注:此内容是本人在另一个技术平台发布的历史文章,转载发布到CSDN; Apache Kafka是一个开源分布式事件流平台,也是当前系统开发中流行的高性能消息队列服务,数千家公司使用它来实现高性能数据管道、流分析、数据集成和关…...
迪威模型网:免费畅享 3D 打印盛宴,科技魅力与趣味创意并存
还在为寻找优质3D打印模型而发愁?快来迪威模型网(https://www.3dwhere.com/),一个集前沿科技与无限趣味于一体的免费3D打印宝藏平台! 踏入迪威模型网,仿佛开启一场未来科技之旅。其“3D打印”专区ÿ…...
ECharts极简入门
ECharts 是一个基于 JavaScript的开源可视化图表库,广泛应用于数据可视化的场景中,支持多种图表类型,如柱状图、折线图、饼图、散点图、雷达图等,且具有强大的自定义功能。 1. ECharts 基本使用 首先需要引入 ECharts 库…...
PHP培训机构教务管理系统小程序源码
🔑 培训机构教务管理系统——智慧教育,高效管理新典范 🚀 这款教务管理系统,是基于前沿的ThinkPHP框架与Uniapp技术深度融合,匠心打造的培训机构管理神器。它犹如一把开启高效运营与精细管理的金钥匙,专为…...
从内核panic到App闪退:一条Android Crash的‘全链路’排查指南(附QCOM平台实战)
从内核panic到App闪退:一条Android Crash的‘全链路’排查指南(附QCOM平台实战) 当用户点击App图标时,很少有人会想到这个简单的动作背后,隐藏着从应用层到芯片级的复杂技术栈。一次看似普通的闪退,可能是S…...
MySQL性能优化:深入理解索引原理与查询优化实战
作为一名后端开发,MySQL是绕不开的必修课。在日常工作中,慢查询往往是系统性能的头号杀手,而索引则是解决这一问题的核心利器。本文将带你从索引的本质出发,深入B树原理,结合Explain工具分析慢SQL,并总结一…...
Boomi将在2026年Boomi World大会上发布数据激活和AI驱动创新的未来规划
这场全球顶级盛会将重点展示各类组织如何激活数据,为AI到商业智能的各类应用提供支持 数据激活公司Boomi今日宣布举办2026年Boomi World大会,这是该公司一年一度的顶级用户大会,将于2026年5月11日至14日在伊利诺伊州芝加哥举行。本次大会将汇…...
【AI 项目 Python 】文档与日志规范:从代码注释到生产追踪的工程实践
文章目录AI 项目 Python 文档与日志规范:从代码注释到生产追踪的工程实践一、引言二、Docstring 规范:代码即文档2.1 三种主流风格对比2.2 Google Style 完整示例2.3 类型注解规范三、项目级文档体系3.1 AI 项目推荐目录结构3.2 README 最小必要元素模型…...
Wan2.1-umt5技术解析:深入理解其卷积神经网络优化策略
Wan2.1-umt5技术解析:深入理解其卷积神经网络优化策略 最近在社区里看到不少关于Wan2.1-umt5模型的讨论,大家普遍觉得它在处理文本和跨模态任务时,速度和效果都挺不错。作为一个长期关注模型底层优化的工程师,我很好奇它到底做了…...
终极XXMI启动器教程:一站式管理所有二次元游戏模组的完整指南
终极XXMI启动器教程:一站式管理所有二次元游戏模组的完整指南 【免费下载链接】XXMI-Launcher Modding platform for GI, HSR, WW and ZZZ 项目地址: https://gitcode.com/gh_mirrors/xx/XXMI-Launcher 你是否厌倦了为不同的二次元游戏安装多个独立的模组管理…...
# SkeyeVSS开发FAQ:内外网 IP 与 WAN 开关配置FAQ 内外网IP与WAN开关配置
试用安装包下载 | SMS | 在线演示 项目地址:https://github.com/openskeye/go-vss 1. 为什么要有 INTERNAL / EXTERNAL GB28181 信令与 SDP 中多处需要填写「对端可见的地址」。同一台服务器: 对 局域网设备 应呈现内网 IP;对 公网设备 应…...
3步完成Windows 11系统优化:Win11Debloat让你的电脑重获新生
3步完成Windows 11系统优化:Win11Debloat让你的电脑重获新生 【免费下载链接】Win11Debloat A simple, lightweight PowerShell script that allows you to remove pre-installed apps, disable telemetry, as well as perform various other changes to declutter …...
5个步骤彻底解决Cursor AI试用限制问题
5个步骤彻底解决Cursor AI试用限制问题 【免费下载链接】cursor-free-vip [Support 0.45](Multi Language 多语言)自动注册 Cursor Ai ,自动重置机器ID , 免费升级使用Pro 功能: Youve reached your trial request limit. / Too m…...
RK3588 Sensor驱动调试踩坑记:从Media Controller找不到Entity到ISP Tuner不可用
RK3588 Sensor驱动调试实战:Media Controller与ISP Tuner问题深度解析 当你在RK3588平台上成功编译并加载了Sensor驱动,却发现media-ctl工具无法识别设备实体,或是ISP调校工具无法正常工作时,这种挫败感只有经历过的人才能体会。本…...
