# Auth 基础模块文档 ## 概述 Auth 基础模块提供了完整的后台管理系统的认证授权功能,包括用户管理、角色管理、权限管理、部门管理等功能。 ## 控制器结构 ``` app/Http/Controllers/Auth/ └── Admin/ ├── Auth.php # 认证控制器 ├── User.php # 用户管理控制器 ├── Role.php # 角色管理控制器 ├── Permission.php # 权限管理控制器 └── Department.php # 部门管理控制器 ``` **命名空间**: `App\Http\Controllers\Auth\Admin` **路由前缀**: `/admin` **中间件**: `auth.check:admin` (后台管理认证) ## 技术栈 - PHP 8.1+ - Laravel 11 - JWT 认证 (tymon/jwt-auth) - Redis 缓存 - Laravel Excel (maatwebsite/excel) ## 数据库表结构 ### auth_users (用户表) - `id`: 主键 - `username`: 用户名(唯一) - `password`: 密码(加密) - `real_name`: 真实姓名 - `email`: 邮箱 - `phone`: 手机号 - `avatar`: 头像 - `department_id`: 部门ID - `status`: 状态(0:禁用, 1:启用) - `last_login_at`: 最后登录时间 - `last_login_ip`: 最后登录IP - `last_active_at`: 最后活跃时间 - `created_at`, `updated_at`: 时间戳 ### auth_roles (角色表) - `id`: 主键 - `name`: 角色名称 - `code`: 角色编码(唯一) - `description`: 角色描述 - `sort`: 排序 - `status`: 状态 - `created_at`, `updated_at`: 时间戳 ### auth_permissions (权限表) - `id`: 主键 - `name`: 权限名称 - `code`: 权限编码(唯一,格式:模块.功能.操作) - `type`: 类型(menu:菜单, api:接口, button:按钮) - `route`: 路由 - `component`: 组件路径 - `icon`: 图标 - `parent_id`: 父级ID - `meta`: 元数据(JSON格式) - `sort`: 排序 - `status`: 状态 - `created_at`, `updated_at`: 时间戳 ### auth_role_permission (角色权限关联表) - `id`: 主键 - `role_id`: 角色ID - `permission_id`: 权限ID ### auth_user_role (用户角色关联表) - `id`: 主键 - `user_id`: 用户ID - `role_id`: 角色ID ### auth_departments (部门表) - `id`: 主键 - `name`: 部门名称 - `parent_id`: 父级ID - `leader`: 负责人 - `phone`: 联系电话 - `sort`: 排序 - `status`: 状态 - `created_at`, `updated_at`: 时间戳 ## API 接口文档 ### 中间件说明 ### AuthCheckMiddleware 这是一个通用的认证中间件,支持通过参数指定不同的路由守卫和权限验证。 #### 基本用法 **1. 只进行登录认证(不检查权限)** ```php // 使用 admin 守卫 Route::middleware(['auth.check:admin'])->group(function () { Route::get('/users', [UserController::class, 'index']); }); // 使用 api 守卫 Route::middleware(['auth.check:api'])->group(function () { Route::get('/profile', [UserController::class, 'profile']); }); ``` **2. 登录认证 + 权限验证** ```php // 验证用户是否有特定权限 Route::middleware(['auth.check:admin,system.user.list'])->group(function () { Route::get('/users', [UserController::class, 'index']); }); // 验证多个权限 Route::middleware(['auth.check:admin,system.user.create'])->group(function () { Route::post('/users', [UserController::class, 'store']); }); ``` **3. 单个路由应用中间件** ```php Route::middleware('auth.check:admin,system.user.delete')->delete('/users/{id}', [UserController::class, 'destroy']); ``` #### 参数说明 - `guard`: 认证守卫名称(必需),例如:`admin`、`api` - `permission`: 权限编码(可选),如果指定则会验证用户是否有该权限 #### 功能特性 - ✅ 支持多个路由守卫(admin、api等) - ✅ 支持登录状态检查 - ✅ 支持用户状态检查(禁用用户无法访问) - ✅ 支持权限验证 - ✅ 自动将用户信息注入到请求中($request->auth_user) - ✅ 自动更新用户最后活跃时间 #### 认证相关 #### 登录 - **接口**: `POST /admin/auth/login` - **参数**: ```json { "username": "admin", "password": "123456" } ``` - **返回**: ```json { "code": 200, "message": "登录成功", "data": { "token": "eyJ0eXAiOiJKV1QiLCJhbGc...", "user": {...}, "menu": {...}, "permissions": {...} } } ``` #### 登出 - **接口**: `POST /admin/auth/logout` - **Header**: `Authorization: Bearer {token}` #### 刷新Token - **接口**: `POST /admin/auth/refresh` - **Header**: `Authorization: Bearer {token}` #### 获取当前用户信息 - **接口**: `GET /admin/auth/me` - **Header**: `Authorization: Bearer {token}` #### 修改密码 - **接口**: `POST /admin/auth/change-password` - **参数**: ```json { "old_password": "123456", "new_password": "654321" } ``` ### 用户管理 #### 获取用户列表 - **接口**: `GET /admin/users` - **参数**: - `page`: 页码(默认1) - `page_size`: 每页数量(默认20) - `keyword`: 搜索关键词(用户名/真实姓名/邮箱) - `status`: 状态(0:禁用, 1:启用) - `department_id`: 部门ID - `role_id`: 角色ID - `order_by`: 排序字段(默认id) - `order_direction`: 排序方向(asc/desc,默认asc) #### 获取用户详情 - **接口**: `GET /admin/users/{id}` #### 创建用户 - **接口**: `POST /admin/users` - **参数**: ```json { "username": "test001", "password": "123456", "real_name": "测试用户", "email": "test@example.com", "phone": "13800138000", "department_id": 1, "role_ids": [1, 2], "status": 1 } ``` #### 更新用户 - **接口**: `PUT /admin/users/{id}` - **参数**: 同创建用户(所有字段都是可选的) #### 删除用户 - **接口**: `DELETE /admin/users/{id}` #### 批量删除用户 - **接口**: `POST /admin/users/batch-delete` - **参数**: ```json { "ids": [1, 2, 3] } ``` #### 批量更新用户状态 - **接口**: `POST /admin/users/batch-status` - **参数**: ```json { "ids": [1, 2, 3], "status": 1 } ``` #### 批量分配部门 - **接口**: `POST /admin/users/batch-department` - **参数**: ```json { "ids": [1, 2, 3], "department_id": 1 } ``` #### 批量分配角色 - **接口**: `POST /admin/users/batch-roles` - **参数**: ```json { "ids": [1, 2, 3], "role_ids": [1, 2] } ``` #### 导出用户 - **接口**: `POST /admin/users/export` - **参数**: ```json { "ids": [1, 2, 3] // 可选,不传则导出所有用户 } ``` #### 导入用户 - **接口**: `POST /admin/users/import` - **参数**: `file` (multipart/form-data, xlsx/xls文件) - **返回**: ```json { "code": 200, "message": "导入完成,成功 10 条,失败 0 条", "data": { "success_count": 10, "error_count": 0, "errors": [] } } ``` #### 下载用户导入模板 - **接口**: `GET /admin/users/download-template` ### 在线用户管理 #### 获取在线用户数量 - **接口**: `GET /admin/online-users/count` #### 获取在线用户列表 - **接口**: `GET /admin/online-users` - **参数**: - `limit`: 数量限制(默认100) #### 获取用户的所有会话 - **接口**: `GET /admin/online-users/{userId}/sessions` #### 强制用户下线(单个会话) - **接口**: `POST /admin/online-users/{userId}/offline` - **参数**: ```json { "token": "用户token" } ``` #### 强制用户所有设备下线 - **接口**: `POST /admin/online-users/{userId}/offline-all` ### 角色管理 #### 获取角色列表 - **接口**: `GET /admin/roles` - **参数**: - `page`, `page_size`, `keyword`, `status`, `order_by`, `order_direction` #### 获取所有角色(不分页) - **接口**: `GET /admin/roles/all` #### 获取角色详情 - **接口**: `GET /admin/roles/{id}` #### 创建角色 - **接口**: `POST /admin/roles` - **参数**: ```json { "name": "编辑", "code": "editor", "description": "编辑角色", "sort": 1, "status": 1, "permission_ids": [1, 2, 3] } ``` #### 更新角色 - **接口**: `PUT /admin/roles/{id}` #### 删除角色 - **接口**: `DELETE /admin/roles/{id}` #### 批量删除角色 - **接口**: `POST /admin/roles/batch-delete` #### 批量更新角色状态 - **接口**: `POST /admin/roles/batch-status` #### 分配权限 - **接口**: `POST /admin/roles/{id}/permissions` - **参数**: ```json { "permission_ids": [1, 2, 3] } ``` #### 获取角色的权限列表 - **接口**: `GET /admin/roles/{id}/permissions` #### 复制角色 - **接口**: `POST /admin/roles/{id}/copy` - **参数**: ```json { "name": "新角色名称", "code": "new_role_code", "description": "新角色描述", "status": 1 } ``` #### 批量复制角色 - **接口**: `POST /admin/roles/batch-copy` - **参数**: ```json { "ids": [1, 2, 3], "name": "新角色名称(可选)", "code": "new_code(可选)" } ``` ### 权限管理 #### 获取权限列表 - **接口**: `GET /admin/permissions` - **参数**: - `page`, `page_size`, `keyword`, `type`, `status`, `order_by`, `order_direction` #### 获取权限树 - **接口**: `GET /admin/permissions/tree` #### 获取菜单树 - **接口**: `GET /admin/permissions/menu` - **返回**: 当前登录用户的菜单树 #### 获取权限详情 - **接口**: `GET /admin/permissions/{id}` #### 创建权限 - **接口**: `POST /admin/permissions` - **参数**: ```json { "name": "用户列表", "code": "system.user.list", "type": "api", "route": "/admin/users", "component": "", "icon": "user", "parent_id": 0, "sort": 1, "status": 1, "meta": { "title": "用户列表", "keepAlive": true } } ``` #### 更新权限 - **接口**: `PUT /admin/permissions/{id}` #### 删除权限 - **接口**: `DELETE /admin/permissions/{id}` #### 批量删除权限 - **接口**: `POST /admin/permissions/batch-delete` #### 批量更新权限状态 - **接口**: `POST /admin/permissions/batch-status` ### 部门管理 #### 获取部门列表 - **接口**: `GET /admin/departments` - **参数**: - `page`, `page_size`, `keyword`, `status`, `order_by`, `order_direction` #### 获取部门树 - **接口**: `GET /admin/departments/tree` #### 获取所有部门(不分页) - **接口**: `GET /admin/departments/all` #### 获取部门详情 - **接口**: `GET /admin/departments/{id}` #### 创建部门 - **接口**: `POST /admin/departments` - **参数**: ```json { "name": "技术部", "parent_id": 0, "leader": "张三", "phone": "13800138000", "sort": 1, "status": 1 } ``` #### 更新部门 - **接口**: `PUT /admin/departments/{id}` #### 删除部门 - **接口**: `DELETE /admin/departments/{id}` #### 批量删除部门 - **接口**: `POST /admin/departments/batch-delete` #### 批量更新部门状态 - **接口**: `POST /admin/departments/batch-status` #### 导出部门 - **接口**: `POST /admin/departments/export` #### 导入部门 - **接口**: `POST /admin/departments/import` - **参数**: `file` (multipart/form-data, xlsx/xls文件) #### 下载部门导入模板 - **接口**: `GET /admin/departments/download-template` ## 权限设计 ### 权限编码规则 权限编码采用 `模块.功能.操作` 的格式,例如: - `system.user.list` - 系统管理-用户-列表 - `system.user.create` - 系统管理-用户-创建 - `system.user.update` - 系统管理-用户-更新 - `system.user.delete` - 系统管理-用户-删除 ### 权限类型 - **menu**: 菜单类型,用于前端路由配置 - **api**: API接口类型,用于后端权限验证 - **button**: 按钮类型,用于前端按钮权限控制 ## 缓存机制 ### 用户在线状态缓存 - **缓存键**: `user_online:{userId}:{tokenHash}` - **过期时间**: 5分钟 - **用途**: 跟踪用户在线状态、最后活跃时间、登录设备信息 ### 权限缓存 - **用户权限列表**: `permission:user:{userId}:permissions` (60分钟) - **用户权限编码**: `permission:user:{userId}:permission_codes` (60分钟) - **用户菜单树**: `permission:user:{userId}:menu_tree` (60分钟) - **角色权限**: `permission:role:{roleId}:permissions` (60分钟) ### 缓存更新时机 - 用户登录/刷新token时,更新在线状态 - 用户角色变化时,清除用户权限缓存 - 角色权限变化时,清除角色和所有关联用户的权限缓存 - 权限本身变化时,清除所有权限缓存 ## 导入导出 ### 用户导入模板字段 - 用户名*(必填) - 密码*(必填) - 真实姓名*(必填) - 邮箱 - 手机号 - 部门名称 - 角色名称(多个用逗号分隔) - 备注 ### 部门导入模板字段 - 部门名称*(必填) - 上级部门名称 - 负责人 - 联系电话 - 排序 - 备注 ### 导出功能 - 支持导出全部数据 - 支持按选中的ID导出 - 导出文件为Excel格式 - 下载后自动删除临时文件 ## 初始化数据 运行数据库迁移和填充命令: ```bash # 执行迁移 php artisan migrate # 填充初始数据 php artisan db:seed --class=AuthSeeder ``` 初始数据包括: - 超级管理员账号(username: admin, password: 123456) - 基础角色(超级管理员、管理员) - 完整的权限菜单 - 默认部门 ## 注意事项 1. **Swoole环境注意事项**: - 避免使用静态变量存储状态 - 避免使用全局变量 - 正确管理数据库连接 - 使用Redis缓存时注意连接池配置 2. **安全注意事项**: - 所有密码必须加密存储 - 使用JWT进行身份认证 - 敏感操作需要记录日志 - 定期清理过期的导出文件 3. **性能优化**: - 使用Redis缓存权限数据 - 大批量操作使用队列处理 - 分页查询避免一次性加载过多数据 4. **权限验证**: - 在中间件中验证用户权限 - 前端根据权限控制按钮显示 - 使用权限缓存减少数据库查询 ## 扩展建议 1. **日志审计**: 添加操作日志记录 2. **数据权限**: 实现基于部门的数据权限控制 3. **多租户**: 支持多租户场景 4. **SSO登录**: 支持第三方单点登录 5. **动态权限**: 支持运行时动态添加权限 ## 常见问题 ### Q: 如何添加新的权限模块? A: 在Seed文件中添加新的权限数据,或者通过API创建新的权限节点。 ### Q: 导入大量数据时超时怎么办? A: 使用队列处理导入任务,分批导入数据。 ### Q: 如何清理权限缓存? A: 调用 `PermissionCacheService::clearAllPermissionCache()` 方法。 ### Q: Swoole环境下如何热重载? A: 运行 `php bin/laravels reload` 命令进行平滑重启。 ### Q: Excel文件支持哪些格式? A: 支持.xlsx和.xls格式文件。