59 lines
1.7 KiB
PHP
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');
|
|
}
|
|
}
|