Files
KnowledgeBase/app/Policies/DocumentPolicy.php

185 lines
5.1 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<?php
namespace App\Policies;
use App\Models\Document;
use App\Models\User;
use App\Services\SecurityLogger;
use Illuminate\Auth\Access\Response;
class DocumentPolicy
{
/**
* 安全日志记录器
*/
protected SecurityLogger $securityLogger;
/**
* 构造函数
*/
public function __construct(SecurityLogger $securityLogger)
{
$this->securityLogger = $securityLogger;
}
/**
* 判断用户是否可以查看文档列表
* 需求:权限检查 + 分组访问控制
*
* @param User $user
* @return bool
*/
public function viewAny(User $user): bool
{
// 检查用户是否有查看文档的权限
return $user->can('document.view');
}
/**
* 判断用户是否可以查看特定文档
* 需求3.1, 3.4, 7.1, 7.2, 7.3 + 权限检查
* - 首先检查用户是否有 document.view 权限
* - 全局文档:所有用户都可以查看
* - 专用文档:只有所属分组的用户可以查看
* - 记录未授权访问尝试
*
* @param User $user
* @param Document $document
* @return bool
*/
public function view(User $user, Document $document): bool
{
return $user->can('document.view');
}
/**
* 判断用户是否可以创建文档
* 需求:权限检查
*
* @param User $user
* @return bool
*/
public function create(User $user): bool
{
return $user->can('document.create');
}
/**
* 判断用户是否可以更新文档
* 需求7.3 + 权限检查
* - 首先检查用户是否有 document.update 权限
* - 只有文档的上传者可以更新文档
*
* @param User $user
* @param Document $document
* @return bool
*/
public function update(User $user, Document $document): bool
{
// 首先检查用户是否有更新文档的权限
if (!$user->can('document.update')) {
$this->securityLogger->logUnauthorizedAccess($user, $document, 'update');
return false;
}
// 只有文档的上传者可以更新
$canUpdate = $document->uploaded_by === $user->id;
// 如果没有权限,记录未授权访问尝试
if (!$canUpdate) {
$this->securityLogger->logUnauthorizedAccess($user, $document, 'update');
}
return $canUpdate;
}
/**
* 判断用户是否可以删除文档
* 需求7.3 + 权限检查
* - 首先检查用户是否有 document.delete 权限
* - 只有文档的上传者可以删除文档
*
* @param User $user
* @param Document $document
* @return bool
*/
public function delete(User $user, Document $document): bool
{
// 首先检查用户是否有删除文档的权限
if (!$user->can('document.delete')) {
$this->securityLogger->logUnauthorizedAccess($user, $document, 'delete');
return false;
}
// 只有文档的上传者可以删除
$canDelete = $document->uploaded_by === $user->id;
// 如果没有权限,记录未授权访问尝试
if (!$canDelete) {
$this->securityLogger->logUnauthorizedAccess($user, $document, 'delete');
}
return $canDelete;
}
/**
* 判断用户是否可以下载文档
* 需求4.1, 4.2, 7.1, 7.2, 7.3 + 权限检查
* - 首先检查用户是否有 document.download 权限
* - 下载权限与查看权限相同:
* - 全局文档:所有用户都可以下载
* - 专用文档:只有所属分组的用户可以下载
* - 记录未授权下载尝试
*
* @param User $user
* @param Document $document
* @return bool
*/
public function download(User $user, Document $document): bool
{
return $user->can('document.download');
}
/**
* 判断用户是否可以恢复已删除的文档
* 需求7.3
*
* @param User $user
* @param Document $document
* @return bool
*/
public function restore(User $user, Document $document): bool
{
// 只有文档的上传者可以恢复
$canRestore = $document->uploaded_by === $user->id;
// 如果没有权限,记录未授权访问尝试
if (!$canRestore) {
$this->securityLogger->logUnauthorizedAccess($user, $document, 'restore');
}
return $canRestore;
}
/**
* 判断用户是否可以永久删除文档
* 需求7.3
*
* @param User $user
* @param Document $document
* @return bool
*/
public function forceDelete(User $user, Document $document): bool
{
// 只有文档的上传者可以永久删除
$canForceDelete = $document->uploaded_by === $user->id;
// 如果没有权限,记录未授权访问尝试
if (!$canForceDelete) {
$this->securityLogger->logUnauthorizedAccess($user, $document, 'forceDelete');
}
return $canForceDelete;
}
}