Aegis是一个功能完整的企业级RBAC(Role-Based Access Control)权限管理系统,采用前后端分离架构设计。系统以权限为核心, 通过用户 -> 角色 -> 权限完成授权,菜单路由与接口资源都通过权限进行关联和控制,可作为企业应用开发的基础框架。
本仓库为 JDK 1.8 + Spring Boot 2.7.18 + Spring Security 5.7.11 版本,与 JDK 21 版本(aegis (jdk21 分支))功能保持一致。
- 🔐 多样化认证: 支持密码、邮箱、短信多种登录方式
- 🔑 Token认证: 基于Opaque Token + Redis的认证机制,支持Token刷新与即时失效
- 🧩 会话控制: 单设备登录、在线状态展示、支持强制下线
- 🛡️ 细粒度权限控制: 权限编码驱动菜单与资源,URL级、按钮级、数据级多层权限控制
- 📊 数据权限: 支持按用户、部门、自定义等多种数据权限范围
- 📁 多存储支持: 支持本地、MinIO、阿里云OSS、腾讯云COS多种文件存储
- 📝 操作审计: 登录日志、操作日志完整记录
- 🚫 防重复提交: 内置防重复提交机制
- 🌍 IP地理位置: 基于ip2region的IP地理位置识别
- 📋 Excel导入导出: 支持Excel文件的导入导出功能
- 📧 邮件服务: 内置邮件发送功能
- 🚦 接口限流: 基于Redis的分布式限流控制
- 🎭 数据脱敏: 支持多种脱敏类型的数据保护
- ⏰ 定时任务: 支持系统通知自动发布等定时任务功能
- 🔍 接口文档: 集成Knife4j提供完整的API文档
- 点击跳转前端仓库
- 点击跳转JDK 21 版本后端仓库
- 点击跳转演示地址
演示环境会定期重置,请勿存放重要数据。
- 管理员账号:
- 账号:
admin - 密码:
123456
- 账号:
- 普通用户账号:
- 账号:
visitor - 密码:
123456
- 账号:
| 技术 | 版本 | 描述 |
|---|---|---|
| Spring Boot | 2.7.18 | 基础框架 |
| Spring Security | 5.7.11 | 安全框架 |
| Redis | - | Token会话存储 |
| MyBatis-Plus | 3.5.12 | ORM框架 |
| Redis | - | 缓存中间件 |
| MySQL | 5.7+ | 关系型数据库 |
| HikariCP | - | 数据库连接池 |
| MapStruct | 1.6.3 | 对象映射 |
| Knife4j | 4.5.0 | API文档 |
| FastExcel | 1.3.0 | Excel处理 |
| UserAgentUtils | 1.21 | 浏览器解析 |
- ☕ JDK 1.8+
- 🗄️ MySQL 5.7+
- 📦 Redis 6.0+
- 🔨 Maven 3.6+
- 克隆项目
git clone https://github.com/OOMEcho/aegis.git
cd aegis- 数据库初始化
# 创建数据库
mysql -u root -p
CREATE DATABASE aegis CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
# 导入表结构和初始数据
mysql -u root -p aegis < src/main/resources/script/aegis.sql
mysql -u root -p aegis < src/main/resources/script/data.sql- 配置修改
编辑 src/main/resources/application.yml 配置文件:
spring:
datasource:
url: jdbc:mysql://127.0.0.1:3306/aegis?serverTimezone=Asia/Shanghai&useSSL=false
username: your_mysql_username
password: your_mysql_password
redis:
host: 127.0.0.1
port: 6379
password: your_redis_password
database: 1
mail:
host: smtp.163.com
username: your_email@163.com
password: your_email_authorization_code # 邮箱授权码,不是登录密码
# Token配置
token:
access-expiration: 900 # 15分钟
refresh-expiration: 604800 # 7天
# 文件存储配置
file:
upload:
platform: LOCAL # 可选: LOCAL, MINIO, ALIYUN_OSS, TENCENT_COS
local:
path: /opt/uploads/- 启动应用
# 编译项目
./mvnw clean compile
# 启动应用
./mvnw spring-boot:run
# 或指定环境
./mvnw spring-boot:run -Dspring-boot.run.profiles=dev- 访问应用
- 应用地址: http://localhost:8080
- API文档: http://localhost:8080/doc.html (用户名/密码: aegis/aegis)
# 构建镜像
docker build -t aegis .
# 运行容器
docker run -p 8088:8088 -d aegis| 模块 | 功能描述 |
|---|---|
| 用户管理 | 用户增删改查、状态管理、密码重置、在线状态、强制下线 |
| 角色管理 | 角色配置、权限分配、数据权限设置 |
| 权限管理 | 权限编码维护、状态控制 |
| 资源管理 | URL/Method与权限映射 |
| 菜单管理 | 菜单配置、权限关联、路由管理 |
| 部门管理 | 组织架构、层级管理、部门权限 |
| 字典管理 | 系统字典、配置管理 |
| 日志管理 | 操作日志、登录日志、导出 |
| 文件管理 | 文件上传、存储管理、访问控制 |
| 通知公告 | 系统通知、公告发布、消息推送、定时发布 |
| IP白名单 | 访问控制、安全防护 |
| 限流控制 | 接口访问频率限制、防刷机制 |
| 数据脱敏 | 敏感数据保护、多种脱敏规则 |
- 密码认证: 传统用户名密码登录
- 邮箱认证: 邮箱验证码登录
- 短信认证: 手机短信验证码登录
- RSA加密: 密码传输加密保护
- 权限模型: 用户 -> 角色 -> 权限
- URL级权限: 资源与权限映射控制接口访问
- 菜单级权限: 菜单与权限关联控制路由
- 按钮级权限: 细粒度操作权限控制
- 数据级权限: 行级数据访问控制
- 全部数据权限: 无限制访问
- 自定义数据权限: 按指定部门范围
- 部门数据权限: 按所属部门
- 部门及以下数据权限: 按部门层级
- 仅本人数据权限: 仅访问本人数据
支持多种存储后端,通过配置切换:
file:
upload:
platform: LOCAL # LOCAL, MINIO, ALIYUN_OSS, TENCENT_COS- 本地存储: 适用于开发和小规模部署
- MinIO: 兼容S3的开源对象存储
- 阿里云OSS: 阿里云对象存储服务
- 腾讯云COS: 腾讯云对象存储服务
com.aegis/
├── AegisApplication.java # 应用启动类
├── common/ # 公共组件
│ ├── constant/ # 系统常量
│ ├── datascope/ # 数据权限
│ ├── domain/ # 通用DTO/VO
│ ├── event/ # 事件驱动
│ ├── exception/ # 全局异常处理
│ ├── file/ # 文件存储抽象
│ ├── limiter/ # 限流功能
│ ├── log/ # 操作日志
│ ├── mask/ # 数据脱敏
│ ├── result/ # 统一响应封装
│ └── validator/ # 自定义验证器
├── config/ # 配置类
│ ├── security/ # Spring Security配置
│ ├── redis/ # Redis配置
│ ├── mp/ # MyBatis-Plus配置
│ ├── jackson/ # JSON序列化配置
│ └── mvc/ # Web MVC配置
├── modules/ # 业务模块
│ ├── common/ # 公共接口(注册、个人信息等)
│ ├── user/ # 用户管理
│ ├── role/ # 角色管理
│ ├── permission/ # 权限管理
│ ├── resource/ # 资源管理
│ ├── menu/ # 菜单管理
│ ├── dept/ # 部门管理
│ ├── dict/ # 数据字典
│ ├── log/ # 系统日志
│ ├── file/ # 文件管理
│ ├── notice/ # 通知公告(含定时任务)
│ └── whitelist/ # IP白名单
└── utils/ # 工具类
系统采用规范化的数据库设计,所有表都包含以下审计字段:
created_by,created_time- 创建审计updated_by,updated_time- 更新审计deleted- 逻辑删除标记 (0=正常, 1=删除)version- 乐观锁版本号
核心表结构:
t_user- 用户信息表t_role- 角色信息表t_user_role- 用户角色关联表t_permission- 权限表t_role_permission- 角色与权限关联表t_menu- 菜单表t_menu_permission- 菜单与权限关联表t_resource- 资源与权限映射表t_whitelist- 白名单表t_dept- 部门信息表t_role_dept- 角色和部门关联表t_sys_operate_log- 操作日志表t_sys_login_log- 登录日志表t_dictionary- 字典表t_notice- 通知公告表t_notice_user- 通知接收记录表t_file_metadata- 文件元数据表
系统采用RESTful API设计规范:
- GET - 查询操作
- POST - 创建操作
- PUT - 更新操作
- DELETE - 删除操作
{
"code": 200,
"message": "操作成功",
"data": {},
"timestamp": "2024-01-01T12:00:00"
}// 数据权限控制
@DataPermission(deptField = "dept_id", userField = "create_by", tableAlias="alias")
public List<User> selectUserList(UserQuery query);
// 操作日志记录
@OperationLog(moduleTitle = "用户管理", businessType = BusinessType.INSERT)
public String createUser(UserDTO dto);
// 防重复提交
@PreventDuplicateSubmit
public String submitForm(FormDTO dto);
// 接口限流
@RateLimiter(time = 60, count = 10, message = "访问过于频繁")
public String limitedApi();
// 数据脱敏
@DataMask(type = MaskTypeEnum.PHONE)
private String phoneNumber;
@DataMask(type = MaskTypeEnum.ID_CARD)
private String idCard;@EnumString(value = {"0", "1"}, message = "状态只允许为0或1")
private String status;系统集成了Knife4j,提供完整的API文档和在线测试功能。
- 文档地址: http://localhost:8080/doc.html
- 访问认证: 用户名和密码均为
aegis
API文档包含:
- 完整的接口列表
- 请求参数说明
- 响应数据结构
- 在线测试功能
- 示例代码生成
# 运行所有测试
./mvnw test
# 运行特定测试类
./mvnw test -Dtest=UserServiceTest
# 生成测试覆盖率报告
./mvnw test jacoco:report- 构建应用
./mvnw clean package -Dmaven.test.skip=true- 配置生产环境
spring:
profiles:
active: prod
knife4j:
enable: false # 生产环境关闭API文档
production: true
logging:
level:
com.aegis: INFO # 生产环境日志级别- 启动应用
java -jar target/aegis-1.0.0.jarversion: '3.8'
services:
aegis:
build: .
ports:
- "8088:8088"
environment:
- SPRING_PROFILES_ACTIVE=prod
- SPRING_DATASOURCE_URL=jdbc:mysql://mysql:3306/aegis
depends_on:
- mysql
- redis
mysql:
image: mysql:5.7
environment:
MYSQL_ROOT_PASSWORD: aegis
MYSQL_DATABASE: aegis
ports:
- "3306:3306"
redis:
image: redis:6-alpine
ports:
- "6379:6379"我们欢迎社区贡献!请遵循以下步骤:
- Fork 本仓库
- 创建特性分支 (
git checkout -b feature/amazing-feature) - 提交更改 (
git commit -m 'Add some amazing feature') - 推送到分支 (
git push origin feature/amazing-feature) - 提交 Pull Request
- 遵循阿里巴巴Java开发手册
- 使用统一的代码格式化配置
- 编写必要的单元测试
- 更新相关文档
本项目基于 MIT License 许可证开源。
- OOMEcho - 项目负责人 - 228389787@qq.com
感谢以下开源项目:
- 🔥 JetBrains- 世界最好的IDE
- 🔥 LINUX DO- 全网最火社区
- Spring Boot - 基础框架
- Spring Security- 安全框架
- MyBatis-Plus - ORM增强工具
- MySQL - 关系型数据库
- Redis - 高性能缓存数据库
- Lombok- Java简化工具
- MapStruct - Java对象映射工具
- ip2region - IP地理位置库
- Knife4j - API文档工具
- Hutool - Java工具类库
如何修改默认的管理员账号?
在数据库中修改 t_user 表的默认管理员记录,或通过管理界面创建新的管理员账号。
如何配置邮件服务?
修改 application.yml 中的邮件配置,确保SMTP服务器地址、端口、用户名和密码正确。
如何切换文件存储方式?
修改 application.yml 中的 file.upload.platform 配置,并配置对应的存储服务参数。
如何自定义数据权限?
在Service方法上使用 @DataPermission 注解,并指定相应的别名参数。
如何配置接口限流?
在Controller方法上使用 @RateLimiter 注解,可配置限流时间、次数和限流类型。
如何使用数据脱敏功能?
在DTO字段上使用 @DataMask 注解,指定脱敏类型即可自动脱敏输出。
如何添加定时任务?
在方法上使用 @Scheduled 注解,参考 NoticeScheduledTask 类的实现方式。
如果您在使用过程中遇到问题,可以通过以下方式寻求帮助:
- 📧 邮件: 228389787@qq.com
- 🐛 Issue: 提交Issue
- 📖 文档: 项目Wiki
如果这个项目对您有帮助,请给它一个 ⭐ Star!
Made with ❤️ by OOMEcho