Files
laravel-gost-template/app/Policies/PersonalDataPolicy.php
2026-06-24 17:20:43 +09:00

59 lines
1.7 KiB
PHP

<?php
namespace App\Policies;
use App\Facades\Audit;
use App\Models\PersonalData;
use App\Models\User;
/**
* Разграничение доступа к персональным данным.
*
* Меры ФСТЭК: УПД.2 (доступ к объектам), УПД.5 (наименьшие привилегии),
* РСБ.2 (регистрация просмотра/изменения ПДн).
*
* Принципы:
* - admin видит все записи; operator — только в рамках своих задач;
* - обычный пользователь — только свои данные (need-to-know).
*/
class PersonalDataPolicy
{
public function viewAny(User $user): bool
{
return $user->hasPermissionTo('pdn.view');
}
public function view(User $user, PersonalData $data): bool
{
$allowed = $user->hasPermissionTo('pdn.view')
&& ($user->hasRole('admin') || $user->id === $data->owner_id);
if ($allowed) {
Audit::log('pdn.viewed', 'read', 'PersonalData:'.$data->id);
}
return $allowed;
}
public function create(User $user): bool
{
return $user->hasPermissionTo('pdn.create');
}
public function update(User $user, PersonalData $data): bool
{
return $user->hasPermissionTo('pdn.update')
&& ($user->hasRole('admin') || $user->id === $data->owner_id);
}
public function delete(User $user, PersonalData $data): bool
{
return $user->hasPermissionTo('pdn.delete') && $user->hasRole('admin');
}
public function export(User $user): bool
{
return $user->hasPermissionTo('pdn.export');
}
}