Skip to content

权限系统

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/userGET用户列表
/admin/userPOST创建用户
/admin/user/{id}PUT更新用户
/admin/user/{id}DELETE删除用户
/admin/user/{id}/rolesPUT分配角色
/admin/user/{id}/passwordPUT重置密码

角色管理

接口方法说明
/admin/roleGET角色列表
/admin/rolePOST创建角色
/admin/role/{id}PUT更新角色
/admin/role/{id}/permissionsPUT分配权限

🛡️ 权限校验

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);
}

⚠️ 注意事项

  1. 超级管理员: 超级管理员拥有所有权限
  2. 权限缓存: 权限数据会缓存,角色变更后需刷新
  3. 数据隔离: 数据权限在查询层自动过滤
  4. 审计日志: 敏感操作记录审计日志

📚 相关文档

基于 Apache-2.0 许可发布 | 感谢 MineAdmin 提供的优秀基础框架