鉴权

简介: 本文介绍基于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;
}
}

相关文章
|
2月前
|
NoSQL Java MongoDB
ongoDB实战演练
本项目实现头条文章评论功能,基于SpringDataMongoDB操作MongoDB数据库,支持评论的增删改查、按文章ID查询及点赞功能。构建article微服务模块,设计Comment实体类,封装评论信息,集成mongodb-driver驱动,完成持久化操作。
|
2月前
|
存储 Ubuntu Linux
容器化部署引擎Docker
本节介绍Docker技术,解决微服务部署中环境不一致、依赖冲突等问题。通过镜像打包应用及依赖,容器隔离运行,实现跨环境无缝迁移。相比虚拟机,Docker更轻量、启动更快、资源占用少。讲解其核心概念:镜像、容器、仓库,以及Docker Hub等镜像管理服务,帮助开发者高效交付应用。
|
2月前
|
存储 JSON NoSQL
MongoDB常用命令
本案例介绍如何使用MongoDB存储文章评论数据。通过`use articledb`创建并切换数据库,利用`db.createCollection()`显式或插入文档时隐式创建集合。文档以BSON格式存储,使用`insert()`方法添加数据,如评论内容、用户信息等。支持查看数据库与集合、删除操作,并遵循命名规范。适用于掌握MongoDB基本CRUD操作。(238字)
|
2月前
|
SQL XML Java
持久层框架MyBatisPlus
本节介绍MyBatisPlus(MP)快速入门,通过继承BaseMapper并引入MP依赖,简化单表增删改查操作,替代传统MyBatis的重复SQL编写,提升开发效率,实现CRUD零XML配置。
|
2月前
|
关系型数据库 MySQL Linux
开发环境搭建
工欲善其事,必先利其器。建议电脑内存16G以上,推荐32G;可配便携显示器提升效率。下载资料并按要求配置虚拟机(CentOS 7,IP:192.168.101.68),安装VMware 16/17,导入虚拟机文件,设置8G内存、8核CPU。苹果用户需用Docker安装MySQL 8。使用FinalShell通过SSH连接虚拟机进行开发。
|
2月前
|
Dubbo Java 应用服务中间件
Feign远程调用
本章介绍Feign如何优雅替代RestTemplate实现HTTP跨服务调用。通过引入Feign,结合注解声明远程接口,避免服务地址硬编码,提升代码可读性与维护性,并支持自定义日志、编码等配置,实现高效、简洁的微服务通信方案。
|
2月前
|
NoSQL JavaScript Shell
MongoDB单机部署
本文介绍MongoDB在Windows系统下的安装启动方法,包括下载32/64位安装包、解压配置、命令行或配置文件方式启动服务,并设置数据目录与端口。同时涵盖Shell连接、图形化工具Compass使用及Linux系统安装要点,助您快速部署运行。
|
2月前
|
负载均衡 Java Nacos
Eureka服务注册与发现
本节介绍Eureka注册中心的搭建与使用,包括服务端工程创建、依赖配置、启动类及YAML配置,并完成user-service服务注册。通过多实例部署为后续Ribbon负载均衡做准备,功能实现后将用Nacos替代Eureka进行深入探讨。(238字)
|
2月前
|
SpringCloudAlibaba Java Nacos
SpringCloud概述
Spring Cloud是Spring推出的微服务统一解决方案,弥补了各技术分散的不足。它具备约定优于配置、组件丰富、开箱即用等特点,支持云原生架构。版本以地铁站命名,避免与子项目冲突。随着Netflix组件停更,Spring Cloud Alibaba凭借Nacos、Sentinel、Seata等成熟组件成为主流选择,经阿里验证,功能完备,生态强大,是当前微服务落地的优选技术栈。
|
2月前
|
SQL Java 数据库连接
持久层框架MyBatisPlus
本节介绍MyBatisPlus,一款基于MyBatis的增强型ORM框架,简化单表增删改查操作。通过引入`mybatis-plus-boot-starter`并继承`BaseMapper`,即可实现无SQL的CRUD功能,显著提升开发效率。同时支持`@TableName`、`@TableId`、`@TableField`等注解,灵活处理表名、字段映射问题,让数据库操作更简洁、高效。(238字)