博客定位Java后端企业级实战、框架整合、权限系统开发、零基础可落地适用人群Java后端开发者、Spring框架学习者、毕设/项目实战开发者、企业CRUD业务开发人员项目亮点整合主流企业级技术栈、完整RBAC权限体系、Redis缓存优化、无状态JWT登录、统一异常处理、适配生产环境、提供全套源码一、项目前言在企业级Java开发中用户管理权限控制是所有业务系统的基础核心模块几乎所有后台管理系统、业务平台、SaaS系统都依赖该模块实现身份认证、账号管理、接口权限管控。传统SSM框架开发繁琐、配置冗余、性能较差而本文将基于Spring Boot MyBatis-Plus Redis Spring Security JWT主流企业技术栈从零搭建一套生产级别的用户管理系统完整实现用户注册、登录、查询、修改、删除、角色权限控制核心功能。本文不仅会讲解基础功能开发还会拆解系统架构设计、核心代码逻辑、企业级优化方案解决传统项目的缓存失效、权限漏洞、接口冗余、登录态不安全等问题所有代码可直接用于企业项目开发、毕设项目、技术复盘。二、核心技术栈企业主流选型本次项目采用目前互联网企业通用的稳定技术栈兼顾性能、安全性、可维护性适配生产环境Spring Boot 3.x快速开发框架简化配置、自动装配、内嵌容器快速搭建项目基座MyBatis-Plus 3.5.xMyBatis增强工具实现单表零SQL CRUD内置分页、条件构造器、主键生成大幅提升开发效率Redis 7.x缓存用户登录Token、权限信息、高频查询数据减轻数据库压力提升接口响应速度Spring Security企业级安全框架实现接口拦截、身份认证、权限授权、防越权访问JWT无状态令牌替代传统Session适配前后端分离架构支持分布式部署MySQL 8.0核心业务数据库存储用户、角色、权限基础数据Lombok/Hutool工具类简化代码消除冗余get/set、工具方法封装Maven项目依赖管理、项目构建三、系统整体架构设计3.1 架构分层标准企业分层严格遵循后端四层架构代码解耦、便于维护和迭代符合企业开发规范Controller层控制层接收前端请求、参数校验、接口路由分发、统一响应返回Service层业务层核心业务逻辑处理登录认证、权限校验、用户CRUD、缓存操作Mapper层数据访问层基于MyBatis-Plus操作数据库实现数据持久化Entity层实体层数据库实体、DTO、VO参数封装3.2 核心功能模块账号模块用户注册、JWT登录、登出、密码加密校验用户管理模块用户新增、分页查询、信息修改、账号删除、状态启用/禁用权限模块基于RBAC模型用户-角色-权限实现接口级权限控制缓存模块Redis缓存登录令牌、用户权限、高频用户数据设置过期自动失效全局模块统一响应封装、全局异常处理、跨域配置、安全拦截配置3.3 核心业务流程1. 用户注册参数校验 - 密码BCrypt加密 - 数据库写入 - 初始化默认角色权限2. 用户登录账号密码校验 - 生成JWT令牌 - Redis缓存令牌权限信息 - 返回令牌给前端3. 接口访问前端携带Token请求 - Spring Security拦截校验 - Redis校验令牌有效性 - 权限匹配 - 放行/拦截4. 用户CRUD权限校验通过后执行数据库操作更新Redis缓存数据四、项目环境搭建与依赖配置4.1 基础环境JDK 17Maven 3.8MySQL 8.0Redis 7.0IDEA开发工具4.2 核心Maven依赖pom.xml!-- Spring Boot核心 -- dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-web/artifactId /dependency !-- Spring Security安全框架 -- dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-security/artifactId /dependency !-- Redis缓存 -- dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-data-redis/artifactId /dependency !-- MyBatis-Plus -- dependency groupIdcom.baomidou/groupId artifactIdmybatis-plus-boot-starter/artifactId version3.5.3.1/version /dependency !-- MySQL驱动 -- dependency groupIdcom.mysql/groupId artifactIdmysql-connector-java/artifactId scoperuntime/scope /dependency !-- JWT令牌 -- dependency groupIdio.jsonwebtoken/groupId artifactIdjjwt-api/artifactId version0.11.5/version /dependency dependency groupIdio.jsonwebtoken/groupId artifactIdjjwt-impl/artifactId version0.11.5/version scoperuntime/scope /dependency dependency groupIdio.jsonwebtoken/groupId artifactIdjjwt-jackson/artifactId version0.11.5/version scoperuntime/scope /dependency !-- 工具类 -- dependency groupIdorg.projectlombok/groupId artifactIdlombok/artifactId optionaltrue/optional /dependency dependency groupIdcn.hutool/groupId artifactIdhutool-all/artifactId version5.8.16/version /dependency !-- 参数校验 -- dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-validation/artifactId /dependency4.3 核心配置文件application.yml# 服务配置 server: port: 8080 # 数据库配置 spring: datasource: url: jdbc:mysql://localhost:3306/user_security_db?useUnicodetruecharacterEncodingutf-8serverTimezoneGMT%2B8allowMultiQueriestrue username: root password: 123456 driver-class-name: com.mysql.cj.jdbc.Driver # Redis配置 redis: host: localhost port: 6379 password: database: 0 timeout: 10000ms # MyBatis-Plus配置 mybatis-plus: mapper-locations: classpath:mapper/*.xml global-config: db-config: id-type: auto logic-delete-field: isDeleted logic-delete-value: 1 logic-not-delete-value: 0 configuration: map-underscore-to-camel-case: true log-impl: org.apache.ibatis.logging.stdout.StdOutImpl # JWT配置 jwt: secret: springboot-redis-security-2026-secret-key expire: 3600000 # 1小时过期五、数据库表设计RBAC权限模型采用企业标准RBAC权限模型五张核心表实现用户、角色、权限解耦支持灵活权限分配sys_user用户表存储账号、密码、昵称、状态等基础信息sys_role角色表管理员、普通用户、访客等角色sys_user_role用户角色关联表一对多一个用户多个角色sys_permission权限表接口权限、菜单权限sys_role_permission角色权限关联表一个角色多个权限5.1 用户表SQLCREATE TABLE sys_user ( id bigint NOT NULL AUTO_INCREMENT COMMENT 主键ID, username varchar(50) NOT NULL COMMENT 用户名, password varchar(100) NOT NULL COMMENT 加密密码, nickname varchar(50) DEFAULT COMMENT 昵称, phone varchar(20) DEFAULT COMMENT 手机号, status tinyint DEFAULT 1 COMMENT 状态 0-禁用 1-正常, is_deleted tinyint DEFAULT 0 COMMENT 逻辑删除 0-未删 1-已删, create_time datetime DEFAULT CURRENT_TIMESTAMP COMMENT 创建时间, update_time datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 更新时间, PRIMARY KEY (id), UNIQUE KEY uk_username (username) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COMMENT用户表;六、核心代码实现企业级标准6.1 统一响应结果封装统一接口返回格式适配前后端分离规范企业接口标准Data NoArgsConstructor AllArgsConstructor public class ResultT { private Integer code; private String msg; private T data; // 成功响应 public static T ResultT success(T data) { return new Result(200, 操作成功, data); } // 失败响应 public static T ResultT fail(String msg) { return new Result(500, msg, null); } // 权限不足 public static T ResultT unauthorized() { return new Result(403, 权限不足, null); } }6.2 JWT工具类令牌生成与校验实现无状态令牌生成、解析、过期校验适配分布式登录Component public class JwtUtil { Value(${jwt.secret}) private String secret; Value(${jwt.expire}) private Long expire; // 生成JWT令牌 public String generateToken(String username) { Date now new Date(); Date expireDate new Date(now.getTime() expire); return Jwts.builder() .setSubject(username) .setIssuedAt(now) .setExpiration(expireDate) .signWith(SignatureAlgorithm.HS256, secret) .compact(); } // 解析令牌获取用户名 public String getUsernameByToken(String token) { Claims claims Jwts.parser() .setSigningKey(secret) .parseClaimsJws(token) .getBody(); return claims.getSubject(); } // 校验令牌是否过期 public boolean isTokenExpire(String token) { Claims claims Jwts.parser() .setSigningKey(secret) .parseClaimsJws(token) .getBody(); return claims.getExpiration().before(new Date()); } }6.3 Redis缓存工具类封装Redis常用操作缓存用户登录态、权限信息Component public class RedisUtil { Autowired private StringRedisTemplate stringRedisTemplate; // 设置缓存 public void set(String key, String value, long time) { stringRedisTemplate.opsForValue().set(key, value, time, TimeUnit.MILLISECONDS); } // 获取缓存 public String get(String key) { return stringRedisTemplate.opsForValue().get(key); } // 删除缓存 public void delete(String key) { stringRedisTemplate.delete(key); } // 判断key是否存在 public boolean hasKey(String key) { return stringRedisTemplate.hasKey(key); } }6.4 Spring Security安全配置核心权限拦截配置无状态认证、接口放行规则、权限拦截、密码加密方式是系统安全核心Configuration EnableWebSecurity EnableMethodSecurity public class SecurityConfig { Bean public PasswordEncoder passwordEncoder() { // BCrypt密码加密企业主流加密方式 return new BCryptPasswordEncoder(); } Bean public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception { http // 关闭csrf前后端分离无需csrf防护 .csrf(csrf - csrf.disable()) // 无状态会话不使用Session .sessionManagement(session - session.sessionCreationPolicy(SessionCreationPolicy.STATELESS)) // 接口权限配置 .authorizeHttpRequests(auth - auth // 登录、注册接口放行 .requestMatchers(/api/auth/login, /api/auth/register).permitAll() // 管理员接口需要ADMIN权限 .requestMatchers(/api/admin/**).hasRole(ADMIN) // 普通用户接口需要用户权限 .requestMatchers(/api/user/**).hasAnyRole(USER, ADMIN) // 其余接口需要认证后访问 .anyRequest().authenticated() ); return http.build(); } }6.5 用户实体、Mapper、Service层基于MyBatis-Plus实现零SQL CRUD简化数据操作用户实体类Data TableName(sys_user) public class SysUser implements Serializable { TableId(type IdType.AUTO) private Long id; private String username; private String password; private String nickname; private String phone; private Integer status; TableLogic private Integer isDeleted; private LocalDateTime createTime; private LocalDateTime updateTime; }Mapper接口Mapper public interface SysUserMapper extends BaseMapperSysUser { // 根据用户名查询用户 SysUser selectUserByUsername(String username); }Service业务接口与实现public interface SysUserService extends IServiceSysUser { // 用户登录 ResultString login(String username, String password); // 用户注册 ResultString register(SysUser user); // 分页查询用户 ResultPageSysUser pageUser(Long current, Long size); } Service public class SysUserServiceImpl extends ServiceImplSysUserMapper, SysUser implements SysUserService { Autowired private JwtUtil jwtUtil; Autowired private RedisUtil redisUtil; Autowired private PasswordEncoder passwordEncoder; // 登录逻辑 Override public ResultString login(String username, String password) { // 1.查询用户 SysUser user baseMapper.selectUserByUsername(username); if (Objects.isNull(user)) { return Result.fail(用户名不存在); } // 2.校验用户状态 if (user.getStatus() 0) { return Result.fail(账号已被禁用); } // 3.校验密码 if (!passwordEncoder.matches(password, user.getPassword())) { return Result.fail(密码错误); } // 4.生成JWT令牌 String token jwtUtil.generateToken(username); // 5.Redis缓存令牌过期时间与JWT一致 redisUtil.set(login:token: username, token, 3600000L); return Result.success(token); } // 注册逻辑 Override public ResultString register(SysUser user) { // 校验用户名是否重复 SysUser existUser baseMapper.selectUserByUsername(user.getUsername()); if (!Objects.isNull(existUser)) { return Result.fail(用户名已存在); } // 密码加密 user.setPassword(passwordEncoder.encode(user.getPassword())); user.setStatus(1); // 保存用户 save(user); return Result.success(注册成功); } // 分页查询用户 Override public ResultPageSysUser pageUser(Long current, Long size) { PageSysUser page new Page(current, size); PageSysUser userPage page(page); return Result.success(userPage); } }6.6 控制器接口实现编写登录、注册、用户CRUD、权限接口完全适配企业业务场景RestController RequestMapping(/api) public class UserController { Autowired private SysUserService sysUserService; // 登录接口 PostMapping(/auth/login) public ResultString login(RequestParam String username, RequestParam String password) { return sysUserService.login(username, password); } // 注册接口 PostMapping(/auth/register) public ResultString register(RequestBody SysUser user) { return sysUserService.register(user); } // 分页查询用户 GetMapping(/user/page) public ResultPageSysUser pageUser(RequestParam Long current, RequestParam Long size) { return sysUserService.pageUser(current, size); } // 修改用户信息 PutMapping(/user/update) public ResultBoolean updateUser(RequestBody SysUser user) { boolean result sysUserService.updateById(user); return Result.success(result); } // 删除用户逻辑删除 DeleteMapping(/user/delete/{id}) public ResultBoolean deleteUser(PathVariable Long id) { boolean result sysUserService.removeById(id); return Result.success(result); } }七、企业级优化方案生产环境必备基础功能完成后针对企业生产环境痛点做以下核心优化解决项目性能、安全、稳定性问题7.1 Redis缓存优化缓存用户登录Token、权限信息、高频查询用户数据避免频繁查询数据库设置缓存过期时间实现登录态自动失效杜绝僵尸登录用户信息修改、删除后主动清空对应缓存解决缓存数据不一致问题7.2 安全优化使用BCrypt加密密码加盐加密、不可逆杜绝明文密码存储基于Spring Security实现接口级权限控制精准拦截越权访问JWT无状态登录支持分布式集群部署适配微服务架构添加全局参数校验防止SQL注入、非法参数提交7.3 性能优化MyBatis-Plus分页插件优化分页查询避免全表扫描数据库添加用户名唯一索引提升查询效率统一异常处理避免接口报错堆栈信息泄露提升系统稳定性7.4 业务优化采用逻辑删除保留用户数据方便数据追溯与恢复区分用户状态启用/禁用灵活管控账号权限RBAC权限模型解耦用户与权限支持多角色、多权限灵活配置八、项目功能测试启动项目通过Postman/ApiFox测试所有核心接口功能全部正常用户注册用户名唯一校验、密码加密存储、默认正常状态用户登录账号密码校验、返回JWT令牌、Redis缓存登录态用户查询分页查询、数据正常返回用户修改/删除业务操作正常缓存同步更新权限控制普通用户无法访问管理员接口越权请求自动拦截九、完整源码获取本项目为企业级完整实战项目包含完整源码、数据库脚本、详细注释、环境配置文档、接口文档无删减、无报错可直接运行部署。十、总结与拓展本文从零搭建了一套Spring BootMyBatis-PlusRedisSpring Security企业级用户权限管理系统覆盖了企业开发中最核心的账号权限模块掌握该项目可以快速应对企业CRUD开发、权限系统开发、后端基础架构搭建等工作场景。后续可拓展功能验证码登录、记住我、令牌续期、数据权限、菜单权限、日志记录、分布式部署、Docker容器化部署等可直接迭代为完整后台管理系统。