Appearance
权限系统
MineShop 的权限系统基于 RBAC(基于角色的访问控制)模型,支持用户、角色、权限的灵活配置,并提供数据权限控制。
🎯 系统架构
┌─────────────────────────────────────────────────────────────┐
│ 用户 (User) │
│ • 账号信息、部门、职位 │
├─────────────────────────────────────────────────────────────┤
│ 角色 (Role) │ 权限 (Permission) │
│ • 角色名称、编码 │ • 菜单权限、操作权限 │
├─────────────────────────────────────────────────────────────┤
│ 数据权限策略 (Policy) │
│ • 数据范围、自定义规则 │
└─────────────────────────────────────────────────────────────┘✨ 核心特性
1. 用户管理
php
// DomainUserService.php
final class DomainUserService extends IService
{
/**
* 创建用户
*/
public function create(UserEntity $entity): User
{
$user = $this->repository->create($entity->toArray());
$this->syncRelations($user, $entity);
return $user;
}
/**
* 同步用户关系(部门、职位、策略)
*/
private function syncRelations(User $user, UserEntity $entity): void
{
// 同步部门
if ($entity->shouldSyncDepartments()) {
$user->department()->sync($entity->getDepartmentIds());
}
// 同步职位
if ($entity->shouldSyncPositions()) {
$user->position()->sync($entity->getPositionIds());
}
// 同步数据权限策略
if ($entity->shouldSyncPolicy()) {
// ...
}
}
}2. 角色管理
| 功能 | 说明 |
|---|---|
| 角色创建 | 定义角色名称、编码、描述 |
| 权限分配 | 为角色分配菜单和操作权限 |
| 角色继承 | 支持角色层级继承 |
3. 数据权限
支持多种数据权限范围:
| 范围 | 说明 |
|---|---|
| 全部数据 | 可查看所有数据 |
| 本部门数据 | 仅查看本部门数据 |
| 本部门及下级 | 查看本部门及下级部门数据 |
| 仅本人数据 | 仅查看自己创建的数据 |
| 自定义 | 自定义数据范围规则 |
🔄 授权流程
┌──────────┐ 分配角色 ┌──────────┐ 获取权限 ┌──────────┐
│ 用户 │ ───────────→ │ 角色 │ ───────────→ │ 权限 │
└──────────┘ └──────────┘ └──────────┘
│ │
│ │
└───────────────────────────────────────────────────┘
权限校验📦 核心服务
php
// 授予角色
public function grantRoles(UserGrantRolesInput $input): void
{
$userEntity = $this->getEntity($input->getUserId());
$roleIds = $this->roleRepository->getRoleIds($input->getRoleCodes());
$result = $userEntity->grantRoles($roleIds);
if ($result->success && $result->shouldSync) {
$this->roleRepository->syncRoles($input->getUserId(), $result->roleIds);
}
}
// 重置密码
public function resetPassword(UserResetPasswordInput $input): bool
{
$userEntity = $this->getEntity($input->getUserId());
$result = $userEntity->resetPasswordWithValidation();
if ($result->needsSave) {
$this->repository->updateById($userEntity->getId(), $userEntity->toArray());
}
return $result->success;
}💻 API 接口
用户管理
| 接口 | 方法 | 说明 |
|---|---|---|
/admin/user | GET | 用户列表 |
/admin/user | POST | 创建用户 |
/admin/user/{id} | PUT | 更新用户 |
/admin/user/{id} | DELETE | 删除用户 |
/admin/user/{id}/roles | PUT | 分配角色 |
/admin/user/{id}/password | PUT | 重置密码 |
角色管理
| 接口 | 方法 | 说明 |
|---|---|---|
/admin/role | GET | 角色列表 |
/admin/role | POST | 创建角色 |
/admin/role/{id} | PUT | 更新角色 |
/admin/role/{id}/permissions | PUT | 分配权限 |
🛡️ 权限校验
php
// 中间件权限校验
public function process(ServerRequestInterface $request, RequestHandlerInterface $handler): ResponseInterface
{
$user = $this->authService->user();
$permission = $this->getRoutePermission($request);
if (!$this->hasPermission($user, $permission)) {
throw new ForbiddenException('无权访问');
}
return $handler->handle($request);
}⚠️ 注意事项
- 超级管理员: 超级管理员拥有所有权限
- 权限缓存: 权限数据会缓存,角色变更后需刷新
- 数据隔离: 数据权限在查询层自动过滤
- 审计日志: 敏感操作记录审计日志