diff --git a/ReadMe.md b/ReadMe.md index b0accb7..78680de 100644 --- a/ReadMe.md +++ b/ReadMe.md @@ -1,14 +1,14 @@ -# 感谢 +# BunnyAuth动态权限控制简介 -> [!important] +> [!IMPORTANT] > > 前端项目整体都由此模板开发 +> +> 项目由[小铭](https://github.com/xiaoxian521)开源权限模板[Pure-admin](https://pure-admin.github.io/vue-pure-admin/) +> +> **Pure-admin文档**:https://pure-admin.github.io/pure-admin-doc -项目由[小铭](https://github.com/xiaoxian521)开源权限模板[Pure-admin](https://pure-admin.github.io/vue-pure-admin/) - -**Pure-admin文档**:https://pure-admin.github.io/pure-admin-doc - -## 视频和地址 +## 视频说明地址 **介绍视频视频** @@ -32,38 +32,209 @@ - 代码生成器前端:https://gitee.com/BunnyBoss/generator-code-web - 代码生成器后端:https://gitee.com/BunnyBoss/generator-code-server -![DAOCHU](D:\Project\Project\FullStack\Auth\auth-server\images\DAOCHU.png) +## 🚀 项目简介 -# 项目预览 +一个基于 Spring Security 6 的现代化动态权限控制系统,提供完整的 RBAC 权限管理解决方案。支持前后端分离架构,可灵活配置细粒度权限控制。 -**线上地址** +## ✨ v4.0.0 重大更新 -正式线上预览地址:http://bunny-web.site/#/welcome +### 核心改进 -> 如果发现网站打开白屏很有可能是因为更新造成的,因为需要维护删除不需要的功能可能会导致这个情况,但基本不会遇到。 -> -> 谷歌方式如下: -> -> ![image-20250108225817891](http://129.211.31.58:9000/docs/image-20250108225817891.png) -> -> Edge方式如下: -> -> ![image-20250108225915189](http://129.211.31.58:9000/docs/image-20250108225915189.png) +- **全面重构**:后端接口、实体类等重构,前端重构部分j+优化操作体验 +- **批量操作支持**: + - ✅菜单管理:完善属性内容 + - ✅ 权限管理:支持 JSON/Excel 导入导出 + - ✅ 角色管理:支持 Excel 批量更新 + - ✅ 多语言配置:支持 JSON/Excel 更新(全量替换模式) -# 项目概览 +### 技术亮点 -接口地址:访问`http:://localhost:7070`会有接口地址信息 +- **注解扫描**:通过 `AnnotationScanner.java` 自动扫描想要的注解 + + ```java + // 示例:扫描特定注解的类 + public static Set> getClassesWithAnnotation(Class annotation) { + // 实现细节... + } + ``` +- **应用场景**: + - 定时任务配置 + - 权限接口发现 -![image-20250222184157801](http://129.211.31.58:9000/docs/image-20250222184157801.png) +### 界面优化 -![image-20241106132548236](http://129.211.31.58:9000/docs/image-20241106132548236.png) +![权限管理界面](./images/image-20250428223816172.png) +![角色管理界面](./images/image-20250428223843974.png) -![image-20241106140545328](http://129.211.31.58:9000/docs/image-20241106140545328.png) +## 🔐 权限控制体系 -![image-20241106141037894](http://129.211.31.58:9000/docs/image-20241106141037894.png) +![image-20250428225337843](./images/image-20250428225337843-1745854181492-5.png) -![image-20241106142208794](http://129.211.31.58:9000/docs/image-20241106142208794.png) +### 访问规则配置 -采用Quarter持久化存储。 +通过 `WebSecurityConfig` 配置 -![image-20241229220003779](http://129.211.31.58:9000/docs/image-20241229220003779.png) +| 路径类型 | 示例 | 访问要求 | 配置方式 | +| -------- | ----------------- | -------- | ------------------------- | +| 公开接口 | `/api/public/**` | 无需认证 | 路径包含 `public` 关键字 | +| 私有接口 | `/api/private/**` | 需登录 | 路径包含 `private` 关键字 | + +### 路径匹配策略 +```java +public static String[] annotations = { ... }; + +// 配置示例 +http.authorizeHttpRequests(auth -> auth + .authorizeHttpRequests(authorize -> authorize + .requestMatchers(annotations).permitAll() +); +``` + +## 🛠️ 应用场景 + +### 1. 纯前端控制模式 + +前端原理详情查看Pure文档:https://pure-admin.cn/pages/RBAC/#%E5%A6%82%E4%BD%95%E9%85%8D%E7%BD%AE + +![image-20250428230444403](./images/image-20250428230444403-1745854157395-3.png) + +- **页面控制**: + 1. 为路由菜单分配角色 + 2. 为用户分配角色 +- **按钮控制**: + ```ts + // 前端权限码配置 + const auth = { + add: ['i18nType::add'], + update: ['i18nType::update'], + delete: ['i18nType::delete'] + }; + ``` + +### 2. 纯后端控制模式 + +- 接口级权限:分页这种就可以添加为`/api/permission/*/*` + + ```java + @Tag(name = "系统权限") + @RestController + @RequestMapping("api/permission") + public class PermissionController { + @Operation(summary = "分页查询", tags = {"permission::page"}) + @GetMapping("{page}/{limit}") + public Result> getPermissionPage( + @PathVariable Integer page, + @PathVariable Integer limit) { + // ... + } + } + ``` + +### 3. 全栈控制模式 +前两个结合 + +## 🛡️ 安全配置 + +### 路径匹配策略 + +AntPath详情:https://juejin.cn/spost/7498247273660743732 + +| 模式 | 示例 | 说明 | +| -------- | --------------- | ---------------- | +| 精确匹配 | `/api/user` | 完全匹配路径 | +| 通配符 | `/api/user/*` | 匹配单级路径 | +| 多级通配 | `/api/user/**` | 匹配多级路径 | +| 方法限定 | `GET /api/user` | 匹配特定HTTP方法 | + +## 🧰 技术栈 + +### 前端 +- Vue 3 + PureAdmin 模板 +- 自定义权限组件 +- 国际化支持 + +### 后端 +- Spring Boot 3 + Spring Security 6 +- JDK 17 +- MySQL + Redis + MinIO +- Swagger + Knife4j 文档 + +### 开发环境 + +根据不懂docker 启动方式不一样 + +```bash +# 一键启动依赖服务 +docker-compose up -d +# 新版的docker +docker compose up -d +``` + +## 📚 最佳实践 + +1. **注解规范**: + ```java + @Tag(name = "模块名称", description = "模块描述") + @Operation(summary = "接口摘要", tags = {"权限码"}) + // 或者 + @Operation(summary = "接口摘要", tags = "权限码") + ``` + +2. **权限码设计**: + - 模块::操作 (如 `user::create`) + - 分层级设计 (如 `system:user:update`) + +3. **批量操作**: + - 使用 Excel/JSON 管理大量权限配置 + - 定期备份权限配置 + +## 🌟 项目优势 + +1. **真正的动态控制** - 无需硬编码权限逻辑 +2. **灵活的数据导入** - 支持多种文件格式 +3. **细粒度控制** - 从页面到按钮的多层级权限 +4. **现代化技术栈** - 基于最新 Spring 生态 +5. **开箱即用** - 提供完整 Docker 部署方案 + +## 📌 注意事项 + +1. 多语言更新会完全替换现有配置 +2. 生产环境建议禁用 Swagger 端点 +4. 复杂权限建议使用 Excel 批量管理 + +## 📈 后续规划 + +- [ ] 权限级别拖拽 +- [ ] 权限树型结构动态添加、更新、删除 +- [ ] 用户设置持久化存储到数据库 +- [ ] 权限弹窗页面优化 +- [ ] 后端文档注释完善 +- [ ] 系统监控后端返回403停止请求 + +## 前后端接口规范 + +### 前端示例规范 + +| **操作** | **API 层** | **Pinia 层** | +| :------- | :------------ | :-------------- | +| 查询单个 | `getUser` | `loadUser` | +| 查询列表 | `getUserList` | `loadUserList` | +| 分页查询 | `getUserPage` | `fetchUserPage` | +| 新增数据 | `createUser` | `addUser` | +| 更新数据 | `updateUser` | `editUser` | +| 删除数据 | `deleteUser` | `removeUser` | + +### 后端接口示例规范 + +遵循Restful + +| **操作** | **RESTful** | +| :------- | :-------------------------- | +| 查询列表 | `GET /users` | +| 分页查询 | `GET /users/{page}/{limit}` | +| 查询单个 | `GET /users/{id}` | +| 新增 | `POST /users` | +| 更新 | `PUT /users/{id}` | +| 删除 | `DELETE /users/{id}` | + +![wx_alipay](./images/wx_alipay.png) diff --git a/images/DAOCHU.png b/images/DAOCHU.png deleted file mode 100644 index 9da9f1d..0000000 Binary files a/images/DAOCHU.png and /dev/null differ diff --git a/images/image-20250428223816172.png b/images/image-20250428223816172.png new file mode 100644 index 0000000..6d31091 Binary files /dev/null and b/images/image-20250428223816172.png differ diff --git a/images/image-20250428223843974.png b/images/image-20250428223843974.png new file mode 100644 index 0000000..efdc016 Binary files /dev/null and b/images/image-20250428223843974.png differ diff --git a/images/image-20250428225337843-1745854181492-5.png b/images/image-20250428225337843-1745854181492-5.png new file mode 100644 index 0000000..9ff413e Binary files /dev/null and b/images/image-20250428225337843-1745854181492-5.png differ diff --git a/images/image-20250428225337843.png b/images/image-20250428225337843.png new file mode 100644 index 0000000..9ff413e Binary files /dev/null and b/images/image-20250428225337843.png differ diff --git a/images/image-20250428230444403-1745854157395-3.png b/images/image-20250428230444403-1745854157395-3.png new file mode 100644 index 0000000..2c5b4a5 Binary files /dev/null and b/images/image-20250428230444403-1745854157395-3.png differ diff --git a/images/image-20250428230444403.png b/images/image-20250428230444403.png new file mode 100644 index 0000000..2c5b4a5 Binary files /dev/null and b/images/image-20250428230444403.png differ diff --git a/images/wx_alipay.png b/images/wx_alipay.png new file mode 100644 index 0000000..f6edd7c Binary files /dev/null and b/images/wx_alipay.png differ