2025年12月28日 星期日

利用 laravel 12 做一個類似Google Drive 的作品-權限與安全


零、目標:
1.專案目標:
   A.環境準備
   B.建立 Laravel 專案 + 登入系統
   C.建立資料庫(資料夾 / 檔案)
   D.資料夾 CRUD
   E.檔案上傳 / 下載
   F.檔案列表(像 Google Drive)
   G.分享連結
   H.權限與安全
    I.回收桶(Soft Delete)
2.目前目標:
   H.權限與安全
       a.用 Policy 做檔案與資料夾權限控管
       b.防止未授權存取(猜網址就能看別人檔案)
       c.Controller 符合 Laravel Best Practice

一、建立 FolderPolicy
    1.指令:php artisan make:policy FolderPolicy --model=Folder
    2.編輯 app/Policies/FolderPolicy.php
public function view(User $user, Folder $folder): bool
    {
        return $folder->user_id === $user->id;
    }
    
    public function update(User $user, Folder $folder): bool
    {
        return $folder->user_id === $user->id;
    }
    與
    public function delete(User $user, Folder $folder): bool
    {
        return $folder->user_id === $user->id;
    }
    如下圖

二、建立 FilePolicy
    1.指令:php artisan make:policy FilePolicy --model=File
    2.編輯 app/Policies/FilePolicy.php
    public function view(User $user, File $file): bool
    {
        return $file->user_id === $user->id;
    }

    public function download(User $user, File $file)
    {
        return $file->user_id === $user->id;
    }

    public function share(User $user, File $file)
    {
        return $file->user_id === $user->id;
    }

    如下圖

三、Controller 改為 authorize(重點)
    1.目的:Controller 變乾淨,安全集中管理
    2.編輯下列檔案
       a.FolderController@show
use Illuminate\Foundation\Auth\Access\AuthorizesRequests;
        
use AuthorizesRequests;
        
        // 安全檢查:只能看自己的資料夾
        $this->authorize('view',$folder);
        如下圖
       b.FileController@download
use Illuminate\Foundation\Auth\Access\AuthorizesRequests;
        
use AuthorizesRequests;
        
        $this->authorize('download',$file);
        如下圖
       c.ShareController@create
use Illuminate\Foundation\Auth\Access\AuthorizesRequests;
        
use AuthorizesRequests;
        
        $this->authorize('share',$file);
        如下圖
四、Blade 層級權限
    1.編輯 folders/show.blade.php
@can('share', $file)
    與
@endcan
    如下圖

五、測試
    1.用A使用者登入
    2.建立檔案
    3.複製檔案下載網址
    4.用B使用者登入
    5.貼上網址->出現403 Forbidden


沒有留言:

張貼留言

在本機Laravel 12 中實作 FaceBook OAuth2 登入

系列文章: 1. 利用 laravel 12 做一個類似Google文件的簡單範例 2. 在本機Laravel 12 中實作 Google OAuth2 登入 3. 如何在 Laravel 12 使用 Gmail SMTP 寄信 4. 在本機Laravel 12 中實作 Face...