1.spring Security的作用:
- 身份认证和授权:核心安全框架,管理用户认证和权限控制
- 提供过滤器链:拦截请求,进行安全验证
- 会话管理:可配置会话策略(无状态、有状态)
- CSRF保护:防止跨站请求伪造
- 密码加密:内置PasswordEncoder
Q1:为什么角色需要加ROLE_前缀?
Spring Security内部使用RoleVoter检查角色时,默认查找以ROLE_开头的权限。这是历史遗留约定。
2.如何自定义角色前缀?
@Bean
public RoleHierarchy roleHierarchy() {
RoleHierarchyImpl roleHierarchy = new RoleHierarchyImpl();
roleHierarchy.setHierarchy("ROLE_ADMIN > ROLE_USER");
return roleHierarchy;
}
@Bean
public DefaultWebSecurityExpressionHandler webSecurityExpressionHandler() {
DefaultWebSecurityExpressionHandler expressionHandler = new DefaultWebSecurityExpressionHandler();
expressionHandler.setRoleHierarchy(roleHierarchy());
expressionHandler.setDefaultRolePrefix(""); // 去掉ROLE_前缀
return expressionHandler;
}
3.如何动态加载权限
@Component
public class DynamicPermissionService {
@Autowired
private PermissionRepository permissionRepository;
public List<ConfigAttribute> getAttributes(String url) {
// 从数据库查询URL需要的权限
List<Permission> permissions = permissionRepository.findByUrl(url);
return permissions.stream()
.map(p -> new SecurityConfig(p.getCode()))
.collect(Collectors.toList());
}
}
4.如果没有自定义登录控制器则是默认启用Spring Security自带的login(请求)
默认登录的优点:
- 快速集成:零配置即可使用
- 功能完整:登录、登出、记住我等功能齐全
- 安全性能好:内置CSRF防护、会话管理
缺点:
- 不灵活:响应格式固定(重定向)
- 不适合前后端分离:默认返回HTML/重定向
- 定制复杂:需要了解Spring Security内部机制
如果想让默认登录适应前后端分离项目,只需要配置.successHandler()和.failureHandler()来自定义JSON响应即可。
2.jwt作用
- 无状态令牌:代替Session,服务端无需村粗会话信息
- 信息自包含:Token自身包含用户信息、权限等
- 跨域友好:适合前后端分离和微服务架构
- 有效期控制: 通过过期时间自动失效
3.redis作用
- Token黑名单/白名单:存储已注销但未过期的Token
- 用户信息缓存:减少数据库查询压力
- 登录限制:记录登录失败次数,防止暴力破解
- 会话管理:在分布式环境下共享会话信息
4.数据流转
-
数据流转时序图
用户 → 前端 → Spring Security → 数据库 → JWT生成 → Redis → 响应
-
验证流程数据流转
登录流程:
1.前端 → 发送用户名密码到 /api/auth/login2.Spring Security → AuthenticationManager 调用 authenticate()
3.UserDetailsService → 从 MySQL 查询用户信息
4.PasswordEncoder → 验证密码(BCrypt对比)
5.认证成功 → 生成JWT Token(包含用户ID、用户名、角色、过期时间)
6.Redis → 缓存用户权限信息(可选)
7.响应 → 返回JWT给前端
-
访问受保护接口流程
1.前端 → 在Header中添加 Authorization: Bearer <token> 2.JwtAuthenticationFilter → 拦截请求,验证token签名和有效期 3.Redis → 检查token是否在黑名单中 4.UserDetailsService → 从DB或Redis缓存加载用户权限 5.SecurityContext → 设置认证信息 6.Spring Security → 检查URL权限配置 7.控制器 → 执行业务逻辑并返回结果