鉴权

简介: 本文介绍基于JWT与Spring Security的客户端Token认证方案。通过HMAC或RSA签名生成Token,结合Spring Boot实现登录鉴权与接口验签。配置WebSecurityConfig安全类,过滤/login请求并生成带过期时间的Token,其余接口通过JWTAuthenticationFilter校验权限,确保系统安全。

.客户端Token方案
1.1 实现思路
简单客户端token校验.vsdx
(57 KB)
1.2 实现细节
参考:https://www.cnblogs.com/dalaoyang/p/11783225.html
2.JWT + Security
RFC7519
JWT
JWT很大程度上还是个新技术,通过使用HMAC(Hash-based Message Authentication Code)计算信息摘要,也可以用RSA公私钥中的私钥进行签名。这个根据业务场景进行选择。
2.1 pom依赖
在/login进行登录并获得Token。剩余接口做token验签,这里我们需要将spring-boot-starter-security加入pom.xml。加入后,我们的Spring Boot项目将需要提供身份验证,相关的pom.xml如下:
至此我们剩余所有的路由都需要身份验证。我们将引入一个安全设置类WebSecurityConfig,这个类需要从WebSecurityConfigurerAdapter类继承。
2.2 安全设置类WebSecurityConfig
先放两个基本类,一个负责存储用户名密码,另一个是一个权限类型,负责存储权限和角色。
2.3 权限类型及角色类
2.4 用户名密码类
在上面的安全设置类中,我们设置所有人都能访问/和POST方式访问/login,其他的任何路由都需要进行认证。然后将所有访问/login的请求,都交给JWTLoginFilter过滤器来处理。稍后我们会创建这个过滤器和其他这里需要的JWTAuthenticationFilter和CustomAuthenticationProvider两个类。
2.5 JWT生成及验签类
Java
运行代码
复制代码
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
import com.test.framework.client.dto.response.JSONResultDTO;
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.authority.AuthorityUtils;

import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Date;
import java.util.List;

class TokenAuthenticationService {
// 5天(单位ms,需要是24H的整数倍:如0.1倍,1倍,10倍,不能0.34倍)
static final long EXPIRATIONTIME = 432_000_000;
static final String SECRET = "P@ssw02d"; // JWT密码
static final String TOKEN_PREFIX = "Bearer"; // Token前缀
static final String HEADER_STRING = "Authorization";// 存放Token的Header Key
// JWT生成方法
static void addAuthentication(HttpServletResponse response, String username) {
// 生成JWT
String JWT = Jwts.builder()
// 保存权限(角色)
.claim("authorities", "ROLE_ADMIN,AUTH_WRITE")
// 用户名写入标题
.setSubject(username)
// 有效期设置
.setExpiration(new Date(System.currentTimeMillis() + EXPIRATIONTIME))
// 签名设置
.signWith(SignatureAlgorithm.HS512, SECRET)
.compact();
// 将 JWT 写入 body
try {
response.setContentType("application/json");
response.setStatus(HttpServletResponse.SC_OK);
response.getOutputStream().println(JSONResult.fillResultString(0, "", JWT));
} catch (IOException e) {
e.printStackTrace();
}
}
// JWT验证方法
static Authentication getAuthentication(HttpServletRequest request) {
// 从Header中拿到token
String token = request.getHeader(HEADER_STRING);
if (token != null) {
// 解析 Token
Claims claims = Jwts.parser()
// 验签
.setSigningKey(SECRET)
// 去掉 Bearer
.parseClaimsJws(token.replace(TOKEN_PREFIX, ""))
.getBody();
// 拿用户名
String user = claims.getSubject();
// 得到 权限(角色)
List authorities = AuthorityUtils.commaSeparatedStringToAuthorityList((String) claims.get("authorities"));
// 返回验证令牌
return user != null ?
new UsernamePasswordAuthenticationToken(user, null, authorities) :
null;
}
return null;
}
}

相关文章
|
3月前
|
NoSQL Java MongoDB
ongoDB实战演练
本项目实现头条文章评论功能,基于SpringDataMongoDB操作MongoDB数据库,支持评论的增删改查、按文章ID查询及点赞功能。构建article微服务模块,设计Comment实体类,封装评论信息,集成mongodb-driver驱动,完成持久化操作。
|
2月前
|
运维 网络协议 Linux
Linux firewalld防火墙使用详解
firewalld是Linux动态防火墙管理工具,替代iptables,支持运行时与永久配置分离、区域隔离、富规则等特性。本教程详解firewall-cmd命令,涵盖核心概念、实战配置及高级功能,助力运维人员快速掌握防火墙管理技能。
|
3月前
|
关系型数据库 MySQL Linux
开发环境搭建
工欲善其事,必先利其器。建议电脑内存16G以上,推荐32G;可配便携显示器提升效率。下载资料并按要求配置虚拟机(CentOS 7,IP:192.168.101.68),安装VMware 16/17,导入虚拟机文件,设置8G内存、8核CPU。苹果用户需用Docker安装MySQL 8。使用FinalShell通过SSH连接虚拟机进行开发。
|
3月前
|
存储 JSON NoSQL
MongoDB常用命令
本案例介绍如何使用MongoDB存储文章评论数据。通过`use articledb`创建并切换数据库,利用`db.createCollection()`显式或插入文档时隐式创建集合。文档以BSON格式存储,使用`insert()`方法添加数据,如评论内容、用户信息等。支持查看数据库与集合、删除操作,并遵循命名规范。适用于掌握MongoDB基本CRUD操作。(238字)
|
3月前
|
负载均衡 Java Nacos
Gateway服务网关
网关是微服务架构的统一入口,实现请求路由、权限控制与限流。基于Spring Cloud Gateway可实现高性能响应式编程,通过断言和过滤器灵活控制流量,保障系统稳定。
|
3月前
|
存储 Java Linux
Nacos注册中心
Nacos安装部署指南:下载稳定版压缩包,通过startup脚本启动,支持Windows/Linux/Mac;配置application.properties避免端口冲突。整合Spring Cloud Alibaba后,替换Eureka为Nacos注册中心,修改配置文件指向Nacos地址并设置集群名,实现服务自动注册与发现。支持多集群部署,提升调用效率与容灾能力。(238字)
|
3月前
|
运维 监控 Java
微服务服务注册与发现
本课程以黑马商城项目为案例,深入讲解单体架构与微服务架构的优缺点,掌握分布式、云原生架构核心概念。通过实践搭建项目环境,学习服务拆分、Nacos注册发现、RestTemplate与OpenFeign远程调用,提升微服务开发与架构设计能力。(238字)
|
3月前
|
NoSQL JavaScript Shell
MongoDB单机部署
本文介绍MongoDB在Windows系统下的安装启动方法,包括下载32/64位安装包、解压配置、命令行或配置文件方式启动服务,并设置数据目录与端口。同时涵盖Shell连接、图形化工具Compass使用及Linux系统安装要点,助您快速部署运行。
|
3月前
|
SQL 安全 关系型数据库
了解SQL注入
SQL注入是一种通过操控用户输入来篡改数据库查询的攻击方式,可导致身份验证绕过、数据泄露、篡改甚至系统命令执行。其原理是利用Web应用对输入数据过滤不严,将恶意SQL代码注入后端数据库。常见防御措施包括使用参数化查询、预编译语句、严格的输入验证(白名单)以及屏蔽敏感错误信息,从源头上防止攻击者操纵SQL逻辑。
|
3月前
|
Dubbo Java 应用服务中间件
Feign远程调用
本章介绍Feign如何优雅替代RestTemplate实现HTTP跨服务调用。通过引入Feign,结合注解声明远程接口,避免服务地址硬编码,提升代码可读性与维护性,并支持自定义日志、编码等配置,实现高效、简洁的微服务通信方案。

热门文章

最新文章