『7x24小时有问必答』
前言
权限管理几乎是每个后台系统都绕不开的模块。网上关于 RBAC 的文章一抓一大把,但大多数要么只讲概念,要么只贴代码片段,真到了落地的时候,还是得自己从头折腾一遍。
本文分享一套可运行的微服务权限管理方案。后端基于 Spring Cloud 2025 + OAuth2 + Nacos,前端用 React 19 + Vite 5 + Ant Design 6,前后端完全分离,开箱即用。如果正打算搞一套权限系统,或者想看看微服务架构下的权限怎么处理,可以花几分钟看看这个项目。

项目介绍

一套基于微服务架构的 RBAC 权限管理系统。整个项目按业务边界拆分成多个独立服务:网关层统一路由和鉴权,认证服务负责发放 Token,管理服务处理具体的业务操作,前后端通过 JSON 交互,松耦合、易扩展。
项目结构上,后端按领域划分为 admin(后台管理)、auth(认证授权)、gateway(网关)和 base(公共基础)四个大模块,前端单独维护。模块之间依赖清晰,不搞复杂的循环引用。数据库方面准备了完整的建表脚本和初始化数据,拉下来配置好 Nacos 和数据库就能跑起来。

项目功能

功能模块
说明
用户管理
账号的增删改查、启用/禁用、密码重置
组织机构
树形结构管理,支持多级组织关系
角色管理
角色的增删改查,给角色分配菜单权限
菜单管理
动态菜单树配置,支持目录、菜单、按钮三种类型
权限控制
基于 RBAC 模型的按钮级权限控制
数据字典
系统字典数据的统一维护
登录认证
验证码登录,JWT Token 签发与续期
网关鉴权
网关层统一校验 Token,下游服务透传用户信息
前端布局
四种布局模式可切换(经典、纵向、横向、分栏)
暗黑模式
支持一键切换亮色/暗色主题
国际化
内置中文/英文两套语言包,可扩展

项目特点

开箱即用:完整的前后端代码、数据库脚本、Nacos 配置,拉下来就能本地运行
服务边界清晰:认证、管理、网关各司其职,改动一个服务不影响其他服务
注解式鉴权:提供了  @EnableAuthFilter  注解,想给哪个服务加鉴权,加个注解就行
配置统一管理:所有服务配置托管在 Nacos,支持动态刷新,不用改代码就能调整参数
环境变量覆盖:数据库、Redis、Nacos 等关键配置支持环境变量覆盖,方便容器化部署
前后端完全分离:前端独立部署,通过 API 与后端交互,不依赖任何模板引擎

项目技术

后端技术栈
分类
技术
版本
核心框架
Spring Boot
3.5.15
微服务
Spring Cloud
2025.0.2
注册配置中心
Nacos
3.2.2
认证授权
OAuth2 + JWT
4.5.0
ORM 框架
MyBatis-Plus
3.5.12
数据库连接池
Druid
1.2.28
数据库
MySQL
8.0+
缓存
Redis
6.0+
API 文档
Knife4j
4.4.0
配置加密
Jasypt
3.0.4
构建工具
Maven
3.9+
运行环境
OpenJDK
21
前端技术栈
分类
技术
版本
框架
React
19.x
构建工具
Vite
5.x
语言
TypeScript
5.x
UI 组件库
Ant Design
6.x
状态管理
Redux Toolkit
2.x
路由
React Router DOM
6.x
图表
ECharts
6.x
国际化
i18next
26.x
HTTP 请求
Axios
1.x
包管理器
pnpm
最新版

项目代码

项目整体采用多模块 Maven 结构,根目录下按服务划分:
cs-springcloud-admin

├── cs-admin                             # 后台管理服务

│    ├── cs-admin-api                 # API 模块:DTO、VO、Model

│    └── cs-admin-server            # 服务端:Controller、Service、Mapper

├── cs-auth                              # 认证授权服务

│    ├── cs-auth-client              # 客户端 SDK:注解、过滤器

│    └── cs-auth-server              # 认证服务端

├── cs-base                              # 基础公共模块

│    ├── cs-base-common              # 工具包:常量、异常、工具类

│    └── cs-base-core                 # 核心基类:BaseController、配置类

├── cs-gateway                          # 网关服务(Spring Cloud Gateway)

├── cs-admin-ui                        # 前端项目(React 19 + Vite 5)

└── doc                                    # 文档与脚本

      └── db                                # SQL 脚本(建表 + 初始化数据)

核心代码片段
认证服务签发 Token 的核心逻辑:
@PostMapping("/login")

public  Result<loginvo>  login(@RequestBody LoginDTO dto)  {

       // 校验验证码

       if  (!authService.checkCaptcha(dto.getCaptchaKey(), dto.getCaptchaCode())) {

             thrownew  BusinessException("验证码错误");

      }

       // 校验用户名密码

      User user = authService.authenticate(dto.getUsername(), dto.getPassword());

       // 生成 JWT Token

      String token = JWT.create()

                  .withSubject(user.getId().toString())

                  .withClaim("username", user.getUsername())

                  .withExpiresAt(new  Date(System.currentTimeMillis() + EXPIRATION))

                  .sign(Algorithm.HMAC256(SECRET));

       return  Result.success(new  LoginVO(token, user));

}

网关层统一鉴权的过滤器:
@Component

publicclass  AuthFilter  implements  GlobalFilter  {

       @Override

       public  Mono<void>  filter(ServerWebExchange exchange, GatewayFilterChain chain)  {

            String token = getTokenFromRequest(exchange.getRequest());

             if  (StringUtils.isBlank(token)) {

                   return  unauthorized(exchange);

            }

             // 解析 Token 并校验有效性

            Claims claims = parseToken(token);

             if  (claims ==  null) {

                   return  unauthorized(exchange);

            }

             // 将用户信息透传到下游服务

            exchange = mutateRequest(exchange, claims);

             return  chain.filter(exchange);

      }

}

前端请求拦截器的封装:
// axios 拦截器

service.interceptors.request.use((config) =>  {

const  token = store.getState().auth.token;

if  (token) {

      config.headers.Authorization =  `Bearer  ${token}`;

   }

return  config;

});

service.interceptors.response.use(

(response) =>  response.data,

(error) =>  {

       if  (error.response?.status ===  401) {

          // Token 失效,跳转登录页

         store.dispatch(logout());

         navigate('/login');

      }

       returnPromise.reject(error);

   }

);

项目效果

登录页走的是验证码 + 用户名密码的流程,验证通过后后端返回 JWT Token,前端存到 Redux 和 localStorage 里。后续所有请求都在 Header 里带上 Token,网关会统一校验。
进入主界面后,左侧菜单完全由后端动态返回,不同角色看到的内容不一样。管理员能看到全部菜单,普通角色只看到自己有权限的部分。页面级权限控制到菜单项,按钮级权限控制到增删改查这类操作按钮。
前端支持四种布局模式:经典、纵向、横向、分栏,根据自己的使用习惯切换就行。暗黑模式也是一键切换,不用刷新页面。国际化目前有中英文,在右上角下拉框直接切换,所有静态文本跟着变。

API 文档集成了 Knife4j,启动后端服务后直接访问  /doc.html  就能看到所有接口的定义、参数、返回值,前端联调或者测试都很方便。

项目源码

项目已完整开源,所有代码托管在 Gitee 和 GitHub:
Gitee:https://gitee.com/cs_springcloud/cs-springcloud-admin
GitHub:https://github.com/cs_springcloud/cs-springcloud-admin
感兴趣的话可以直接 clone 下来跑一跑。

总结

一套趁手的权限管理脚手架,能让后续的业务开发省不少事。这套项目从服务拆分、技术选型到代码实现,走的都是比较主流的方案,没有整什么花活。用到了 Spring Cloud 2025、OAuth2、Nacos、MyBatis-Plus、React 19、Vite 5、Ant Design 6 这些技术,结构清晰,扩展性也还不错。
当然,项目还有很多可以完善的地方,比如更细粒度的数据权限、操作日志审计、分布式事务等。后续会根据实际需要逐步迭代。

关键词

RBAC权限管理、Spring Cloud微服务、OAuth2认证授权、Nacos配置中心、JWT令牌、React后台管理、Ant Design组件库、前后端分离、MyBatis-Plus、Spring Boot 3.5、Vite构建工具、TypeScript、网关统一鉴权、动态菜单、按钮级权限控制、暗黑模式、国际化、Knife4j接口文档、Jasypt配置加密、代码开源
作者:小码编匠
出处:gitee.com/smallcore/DotNetCore
声明:网络内容,仅供学习,尊重版权,侵权速删,歉意致谢!

END

面向企业后台、SaaS管理端、数据可视化平台和内部低代码工具的中后台框架

备注【开源
方便大家交流、资源共享和共同成长
纯技术交流群、需要的小伙伴请扫码

有收获?不妨分享让更多人受益
关注「程序员开源栈」,共同提升技术实力

点分享
点收藏
点在看
点点赞
</void></loginvo>

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

上一主题上一主题         下一主题下一主题
QQ手机版小黑屋粤ICP备17165530号

关于我们·投诉举报· 用户帮助· 联系我们 · 本站服务 · 版权声明· 隐私政策 · 投搞指南

法律保护:PLC技术网,plcjs.com,plcjs.net等字样
Copyright 2010-2030. All rights reserved. 


微信公众号二维码 抖音二维码 百家号二维码 今日头条二维码哔哩哔哩二维码