鉴权

简介: 本文介绍基于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月前
|
运维 网络协议 Linux
Linux firewalld防火墙使用详解
firewalld是Linux动态防火墙管理工具,替代iptables,支持运行时与永久配置分离、区域隔离、富规则等特性。本教程详解firewall-cmd命令,涵盖核心概念、实战配置及高级功能,助力运维人员快速掌握防火墙管理技能。
|
4月前
|
JSON 缓存 前端开发
什么是跨域
CORS(跨域资源共享)是W3C标准,允许浏览器向跨源服务器发起XMLHttpRequest请求,突破AJAX同源限制。需浏览器和服务器共同支持,IE10+兼容。通信由浏览器自动完成,开发者无需特殊编码。分为简单请求与非简单请求,后者会先发送OPTIONS预检请求,验证通过后才进行实际请求。相比仅支持GET的JSONP,CORS支持所有HTTP方法,更安全灵活。
|
4月前
|
安全 Java 应用服务中间件
实现权限管理的技术
权限管理技术选型需综合考量。常见方案如Apache Shiro,轻量易用但安全维护弱;Spring Security功能强大,集成度高但较重;自定义ACL契合业务但理解成本高。多数技术基于ACL或RBAC模型封装,选型应结合项目实际,权衡优劣。
|
4月前
|
JSON Java 数据格式
不定参数入参
支持JSON入参的接口开发示例,涵盖单个/多个独立参数及封装对象参数的处理方式。通过@RequestBody接收JSON数据,结合@Valid进行参数校验,提升代码规范性与可维护性。
|
4月前
|
存储 监控 Java
整合切面,参数拦截+过滤
该类基于Spring AOP实现请求参数日志拦截,自动记录Web层请求来源、URL、方式、方法及入参,并统计接口耗时。通过`@Before`、`@Around`、`@After`注解实现前置、环绕、后置通知,结合`ThreadLocal`计算执行时间,便于调试与监控,日志统一输出至指定文件,提升系统可观测性。(238字)
|
4月前
|
Java Spring
自动装配机制
@SpringBootApplication是Spring Boot核心注解,为组合注解,包含@Configuration、@ComponentScan、@EnableAutoConfiguration等。其通过@Import导入AutoConfigurationImportSelector和Registrar,实现自动配置类加载与包路径注册,结合元注解实现类扫描与条件过滤,完成自动装配的源码级实现。
|
4月前
|
NoSQL Java Redis
整合Logback,滚动记录+多文件
本文介绍了`logback-spring.xml`的配置应用,结合Java示例展示如何通过`LogProxy`获取不同日志级别(INFO/ERROR)的Logger,并在Spring Boot控制器中记录日志,同时集成Redis操作,实现服务调用与日志分离管理,提升系统可维护性。(238字)
|
4月前
|
Web App开发 安全 JavaScript
跨域处理
跨域指协议、域名、端口不同时的资源请求。浏览器因同源策略限制,默认阻止跨域请求。通过CORS(跨域资源共享)可在服务端设置Access-Control-Allow-Origin等响应头,实现安全跨域。Spring Boot中可通过@CrossOrigin注解或全局配置WebMvcConfigurer实现细粒度跨域控制,支持指定域名、方法、请求头及凭证传递。
|
4月前
|
安全 Java Spring
.过滤器链加载原理
通过前文十五个过滤器的解析,我们了解了Spring Security的工作流程。虽未显式配置,但这些过滤器由DelegatingFilterProxy通过名称springSecurityFilterChain自动加载,最终交由FilterChainProxy执行。其核心是DefaultSecurityFilterChain,封装了所有安全过滤器。底层原理明晰后,方可更好实现自定义认证页面。
|
4月前
|
前端开发 安全 Java
自定义认证前端页面
简介:本文介绍前后端集成Spring Security的登录认证实现。前端包含login.html登录页面;后端通过配置HttpSecurity实现权限控制,包括表单登录、认证流程及CSRF关闭等。启动后访问/index自动跳转至登录页,输入user及控制台密码即可登录成功获取接口数据。(238字)

热门文章

最新文章