新增职务权限管理与聊天室管理权限控制
This commit is contained in:
@@ -0,0 +1,92 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* 文件功能:职务权限判断服务
|
||||
* 负责把当前用户的在职职务权限转换为统一布尔判断,
|
||||
* 供控制器和 Blade 视图复用。
|
||||
*/
|
||||
|
||||
namespace App\Services;
|
||||
|
||||
use App\Models\User;
|
||||
use App\Support\PositionPermissionRegistry;
|
||||
|
||||
/**
|
||||
* 类功能:统一提供用户职务权限读取与校验方法。
|
||||
*/
|
||||
class PositionPermissionService
|
||||
{
|
||||
/**
|
||||
* 返回当前用户拥有的全部聊天室权限码。
|
||||
*
|
||||
* 规则:
|
||||
* - id=1 站长始终拥有全部权限
|
||||
* - 其他用户仅按当前在职职务的 permissions 生效
|
||||
*
|
||||
* @return list<string>
|
||||
*/
|
||||
public function permissionsForUser(?User $user): array
|
||||
{
|
||||
if (! $user) {
|
||||
return [];
|
||||
}
|
||||
|
||||
if ($user->id === 1) {
|
||||
return PositionPermissionRegistry::codes();
|
||||
}
|
||||
|
||||
$position = $user->activePosition?->position;
|
||||
if (! $position) {
|
||||
return [];
|
||||
}
|
||||
|
||||
return array_values(array_intersect(
|
||||
PositionPermissionRegistry::codes(),
|
||||
$position->permissions ?? [],
|
||||
));
|
||||
}
|
||||
|
||||
/**
|
||||
* 返回当前用户全部权限的布尔映射表。
|
||||
*
|
||||
* @return array<string, bool>
|
||||
*/
|
||||
public function permissionMapForUser(?User $user): array
|
||||
{
|
||||
$permissionMap = array_fill_keys(PositionPermissionRegistry::codes(), false);
|
||||
|
||||
foreach ($this->permissionsForUser($user) as $permission) {
|
||||
$permissionMap[$permission] = true;
|
||||
}
|
||||
|
||||
return $permissionMap;
|
||||
}
|
||||
|
||||
/**
|
||||
* 判断用户是否拥有指定权限码。
|
||||
*/
|
||||
public function hasPermission(?User $user, string $permission): bool
|
||||
{
|
||||
if (! in_array($permission, PositionPermissionRegistry::codes(), true)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
return in_array($permission, $this->permissionsForUser($user), true);
|
||||
}
|
||||
|
||||
/**
|
||||
* 判断用户是否至少拥有一项指定权限。
|
||||
*
|
||||
* @param list<string> $permissions
|
||||
*/
|
||||
public function hasAnyPermission(?User $user, array $permissions): bool
|
||||
{
|
||||
foreach ($permissions as $permission) {
|
||||
if ($this->hasPermission($user, $permission)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user