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技术深度融合,匠心打造的培训机构管理神器。它犹如一把开启高效运营与精细管理的金钥匙,专为…...

UE5 学习系列(二)用户操作界面及介绍
这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…...
Python爬虫实战:研究MechanicalSoup库相关技术
一、MechanicalSoup 库概述 1.1 库简介 MechanicalSoup 是一个 Python 库,专为自动化交互网站而设计。它结合了 requests 的 HTTP 请求能力和 BeautifulSoup 的 HTML 解析能力,提供了直观的 API,让我们可以像人类用户一样浏览网页、填写表单和提交请求。 1.2 主要功能特点…...

Linux应用开发之网络套接字编程(实例篇)
服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …...

智慧医疗能源事业线深度画像分析(上)
引言 医疗行业作为现代社会的关键基础设施,其能源消耗与环境影响正日益受到关注。随着全球"双碳"目标的推进和可持续发展理念的深入,智慧医疗能源事业线应运而生,致力于通过创新技术与管理方案,重构医疗领域的能源使用模式。这一事业线融合了能源管理、可持续发…...

2025年能源电力系统与流体力学国际会议 (EPSFD 2025)
2025年能源电力系统与流体力学国际会议(EPSFD 2025)将于本年度在美丽的杭州盛大召开。作为全球能源、电力系统以及流体力学领域的顶级盛会,EPSFD 2025旨在为来自世界各地的科学家、工程师和研究人员提供一个展示最新研究成果、分享实践经验及…...

前端导出带有合并单元格的列表
// 导出async function exportExcel(fileName "共识调整.xlsx") {// 所有数据const exportData await getAllMainData();// 表头内容let fitstTitleList [];const secondTitleList [];allColumns.value.forEach(column > {if (!column.children) {fitstTitleL…...
系统设计 --- MongoDB亿级数据查询优化策略
系统设计 --- MongoDB亿级数据查询分表策略 背景Solution --- 分表 背景 使用audit log实现Audi Trail功能 Audit Trail范围: 六个月数据量: 每秒5-7条audi log,共计7千万 – 1亿条数据需要实现全文检索按照时间倒序因为license问题,不能使用ELK只能使用…...
测试markdown--肇兴
day1: 1、去程:7:04 --11:32高铁 高铁右转上售票大厅2楼,穿过候车厅下一楼,上大巴车 ¥10/人 **2、到达:**12点多到达寨子,买门票,美团/抖音:¥78人 3、中饭&a…...
OkHttp 中实现断点续传 demo
在 OkHttp 中实现断点续传主要通过以下步骤完成,核心是利用 HTTP 协议的 Range 请求头指定下载范围: 实现原理 Range 请求头:向服务器请求文件的特定字节范围(如 Range: bytes1024-) 本地文件记录:保存已…...
OpenLayers 分屏对比(地图联动)
注:当前使用的是 ol 5.3.0 版本,天地图使用的key请到天地图官网申请,并替换为自己的key 地图分屏对比在WebGIS开发中是很常见的功能,和卷帘图层不一样的是,分屏对比是在各个地图中添加相同或者不同的图层进行对比查看。…...