1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117
| enum Permission: string { case USER_READ = 'user.read'; case USER_CREATE = 'user.create'; case USER_UPDATE = 'user.update'; case USER_DELETE = 'user.delete'; case POST_READ = 'post.read'; case POST_CREATE = 'post.create'; case POST_UPDATE = 'post.update'; case POST_DELETE = 'post.delete'; case ADMIN_PANEL = 'admin.panel'; case SYSTEM_CONFIG = 'system.config'; public function getGroup(): string { return explode('.', $this->value)[0]; } public function getAction(): string { return explode('.', $this->value)[1]; } public function getDescription(): string { return match($this) { self::USER_READ => '查看用户信息', self::USER_CREATE => '创建用户', self::USER_UPDATE => '更新用户信息', self::USER_DELETE => '删除用户', self::POST_READ => '查看文章', self::POST_CREATE => '创建文章', self::POST_UPDATE => '更新文章', self::POST_DELETE => '删除文章', self::ADMIN_PANEL => '访问管理面板', self::SYSTEM_CONFIG => '系统配置管理', }; } public static function getByGroup(string $group): array { return array_filter( self::cases(), fn(Permission $permission) => $permission->getGroup() === $group ); } }
enum Role: string { case SUPER_ADMIN = 'super_admin'; case ADMIN = 'admin'; case MODERATOR = 'moderator'; case USER = 'user'; case GUEST = 'guest'; public function getPermissions(): array { return match($this) { self::SUPER_ADMIN => Permission::cases(), self::ADMIN => [ Permission::USER_READ, Permission::USER_CREATE, Permission::USER_UPDATE, Permission::POST_READ, Permission::POST_CREATE, Permission::POST_UPDATE, Permission::POST_DELETE, Permission::ADMIN_PANEL, ], self::MODERATOR => [ Permission::USER_READ, Permission::POST_READ, Permission::POST_UPDATE, Permission::POST_DELETE, ], self::USER => [ Permission::POST_READ, Permission::POST_CREATE, ], self::GUEST => [ Permission::POST_READ, ], }; } public function hasPermission(Permission $permission): bool { return in_array($permission, $this->getPermissions()); } public function getLevel(): int { return match($this) { self::SUPER_ADMIN => 5, self::ADMIN => 4, self::MODERATOR => 3, self::USER => 2, self::GUEST => 1, }; } }
class User { public function __construct( private string $id, private string $name, private Role $role = Role::USER ) {} public function hasPermission(Permission $permission): bool { return $this->role->hasPermission($permission); } public function can(Permission $permission): bool { return $this->hasPermission($permission); } public function getRole(): Role { return $this->role; } }
|