简介
- Spring Security是一个Java框架,用于保护应用程序的安全性。它提供了一套全面的安全解决方案,包括身份验证、授权、防止攻击等功能。
- Spring Security基于过滤器链的概念,可以轻松地集成到任何基于Spring的应用程序中。它支持多种身份验证选项和授权策略,开发人员可以根据需要选择适合的方式。
- 此外,Spring Security还提供了一些附加功能,如集成第三方身份验证提供商和单点登录,以及会话管理和密码编码等。
- 总之,Spring Security是一个强大且易于使用的框架,可以帮助开发人员提高应用程序的安全性和可靠性。
登入校验流程
- 用户输入账号密码请求登入接口
- 后端根据参数去数据库查询是否存在用户
- 如果存在数据,会返回一个JWT
- 前端拿到JWT之后,访问其他请求都需要携带这个JWT
- 后端拿到JWT之后,解析并获取其中的用户信息
- 如果用户有权限则允许访问相关资源
查看springSecurity的过滤器链
- pom.xml添加如下依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
- main方法
public static void main(String[] args) {
ConfigurableApplicationContext context = SpringApplication.run(MybatisBatchInsertApplication.class, args);
System.out.println("context = " + context);
}
此处编写System.out.println("context = " + context);只是为了方便打断点
每一个过滤器的作用与功能
- WebAsyncManagerIntegrationFilter
- 作用:确保在异步 Web 请求处理过程中,SecurityContext 能正确传递。
- 功能:集成 Spring Security 与 Spring Web 的异步请求支持。
- SecurityContextPersistenceFilter
- 作用:负责加载和存储 SecurityContext,它包含当前用户的安全信息。
- 功能:在请求开始时加载 SecurityContext,在请求结束时存储 SecurityContext。
- HeaderWriterFilter
- 作用:添加安全相关的 HTTP 头部。
- 功能:例如,设置 X-Content-Type-Options、X-Frame-Options、X-XSS-Protection 头部来防止各种常见的攻击。
- CsrfFilter
- 作用:防御跨站请求伪造(CSRF)攻击。
- 功能:在每个请求中验证 CSRF 令牌,确保请求是由合法用户发出的。
- LogoutFilter
- 作用:处理用户的注销请求。
- 功能:执行注销逻辑,清除用户的认证信息和会话。
- UsernamePasswordAuthenticationFilter
- 作用:处理基于表单的登录认证请求。
- 功能:验证用户提交的用户名和密码,如果成功,生成认证信息并存储在 SecurityContext 中。
- DefaultLoginPageGeneratingFilter
- 作用:生成默认的登录页面。
- 功能:在没有自定义登录页面时,提供一个默认的登录页面。
- DefaultLogoutPageGeneratingFilter
- 作用:生成默认的注销页面。
- 功能:在没有自定义注销页面时,提供一个默认的注销页面。
- BasicAuthenticationFilter
- 作用:处理 HTTP Basic 认证。
- 功能:从 HTTP 请求头中提取用户名和密码,并进行认证。
- RequestCacheAwareFilter
- 作用:处理请求缓存。
- 功能:在用户登录后,自动重定向到登录前尝试访问的受保护资源。
- SecurityContextHolderAwareRequestFilter
- 作用:为 HttpServletRequest 提供一些辅助方法。
- 功能:使得请求对象在安全上下文中更便于使用,例如提供获取当前用户的方法。
- AnonymousAuthenticationFilter
- 作用:为未认证的用户提供匿名身份。
- 功能:如果用户没有登录,赋予其匿名身份,以便应用程序能够处理匿名用户的请求。
- SessionManagementFilter
- 作用:处理会话管理相关的功能。
- 功能:例如防止会话固定攻击,确保会话在用户认证之后安全。
- ExceptionTranslationFilter
- 作用:将认证异常转换为适当的 HTTP 响应。
- 功能:处理认证异常(如 AccessDeniedException 和 AuthenticationException),并将其转换为适当的 HTTP 状态码和错误信息。
- FilterSecurityInterceptor
- 作用:执行最终的访问控制决策。
- 功能:根据配置的访问决策管理器和投票器,决定请求是否被允许访问目标资源。
生成JWT的核心算法
/**
* 生成jwt
* @param subject 需要加密的信息
* @param ttlMillis 过期时间
* @param uuid 唯一id
* @return
*/
private static JwtBuilder getJwtBuilder(String subject, Long ttlMillis, String uuid) {
SignatureAlgorithm signatureAlgorithm = SignatureAlgorithm.HS256;
SecretKey secretKey = generalKey();
long nowMillis = System.currentTimeMillis();
Date now = new Date(nowMillis);
if(ttlMillis==null){
ttlMillis=JwtUtil.JWT_TTL;
}
long expMillis = nowMillis + ttlMillis;
Date expDate = new Date(expMillis);
return Jwts.builder()
.setId(uuid)
.setSubject(subject)
.setIssuer("whs")
.setIssuedAt(now)
//使用HS256对称加密算法签名, 第二个参数为秘钥
.signWith(signatureAlgorithm, secretKey)
.setExpiration(expDate);
}
解析JWT的核心算法
/**
* 解析jwt
* @param jwt
* @return
* @throws Exception
*/
public static Claims parseJWT(String jwt) throws Exception {
SecretKey secretKey = generalKey();
return Jwts.parser()
.setSigningKey(secretKey)
.parseClaimsJws(jwt)
.getBody();
}