Spring Security + JWT + Redis 的认证授权系统

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/login

    2.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.控制器 → 执行业务逻辑并返回结果
相关推荐
Wang's Blog2 分钟前
Java 项目部署之 Docker工具快速入门: Docker 架构拆解:镜像、容器、守护进程与 Registry
java·docker·架构
栗子~~3 分钟前
SpringCloud Gateway 基于 Nacos 实现动态路由
java·spring cloud·gateway
FYKJ_201011 分钟前
django个性化新闻推荐35173-计算机课程设计、毕业设计
java·spring boot·后端·python·架构·django·课程设计
Codiggerworld18 分钟前
Redis 正式接入 AI:当“最懂速度的数据库“开始解决“记忆问题“
数据库·人工智能·redis
白露与泡影18 分钟前
Redis 正式接入 AI:当“最懂速度的数据库“开始解决“记忆问题“
数据库·人工智能·redis
计算机毕设定制辅导-无忧学长20 分钟前
《校园食堂在线订餐小程序的设计与实现》
java·vue.js·spring boot·微信小程序·uniapp·校园食堂在线订餐小程序
夜之眷属26 分钟前
服务启动即崩:InetAddress.getLocalHost() 抛 UnknownHostException 排查记
java·运维·后端·docker
我不会插花弄玉26 分钟前
3.通用命令【由浅入深-redis】
数据库·redis·bootstrap
IT研究室28 分钟前
最新计算机毕业设计选题推荐-基于spring boot的食品安全信息管理系统-网站-文档指导-Java-springboot
java·spring boot·课程设计
Sayai1 小时前
MCP Server 开发实战:Spring AI 把后端日志查询暴露给 AI Agent(7 条设计原则与踩坑实录)
java·人工智能·ai agent·spring ai·mcp