laravel策略(this action is unauthorized)


授權用戶是否可以執行某個動作

方法1:

可以通過編寫Gates進行定義

在App\Providers\AuthServiceProvider文件中的boot方法中:

public function boot()
    {
        $this->registerPolicies();

        Gate::define('userupdate', function ($currentUser,$model) {
            return $currentUser->id === $model->id;
        });

    }

  $currentUser是當前登錄用戶,$model是要操作的模型,通過判斷當前用戶模型以及要操作的模型的id是否相等,來授權用戶是否能進行某一步的操作

控制器使用

$bool = Gate::allows(' userupdate', $ user);//如果兩者的id相等$bool為true,否則為false,如果使用Gate::authorize('update', $post);沒有權限時拋出異常,http響應報錯
具體其它的操作方法可以在laravel文檔中查看 https://learnku.com/docs/laravel/6.x/authorization/5153
 
方法二:
創建策略
生成策略
php artisan make:policy PostPolicy        //生成的策略將放在 app/Policies 目錄
生成策略后就要注冊:
注冊一個策略將指導 Laravel 在授權針對給定模型的操作時使用哪個策略:
<?php

namespace App\Providers;

use App\Post;
use App\Policies\PostPolicy;
use Illuminate\Support\Facades\Gate;
use Illuminate\Foundation\Support\Providers\AuthServiceProvider as ServiceProvider;

class AuthServiceProvider extends ServiceProvider
{
    /**
     * 應用程序的策略映射。
     *
     * @var array
     */
    protected $policies = [
        Post::class => PostPolicy::class,//post模型對應post策略
    ];

    /**
     * 注冊任何應用程序 authentication / authorization 服務。
     *
     * @return void
     */
    public function boot()
    {
        $this->registerPolicies();

        //
    }
}

  也可以使用自動注冊策略:

<?php

namespace App\Providers;
.
.
.
class AuthServiceProvider extends ServiceProvider
{
    .
    .
    .
    public function boot()
    {
        $this->registerPolicies();
        // 修改策略自動發現的邏輯
        Gate::guessPolicyNamesUsing(function ($modelClass) {
            // 動態返回模型對應的策略名稱,如:// 'App\Models\User' => 'App\Policies\UserPolicy',
            return 'App\Policies\\'.class_basename($modelClass).'Policy';
        });
    }
}
//這里的模型都是放在App\Models\目錄

  編寫策略:

<?php

namespace App\Policies;

use App\User;
use App\Post;

class PostPolicy
{
    /**
     * 確定用戶是否可以更新給定的帖子。
     *
     * @param  \App\User  $user
     * @param  \App\Post  $post
     * @return bool
     */
    public function update(User $user, Post $post)
    {
        return $user->id === $post->user_id;
    }
}

  控制器使用策略:

<?php

namespace App\Http\Controllers;

use App\Post;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;

class PostController extends Controller
{
    /**
     * 更新指定博客帖子。
     *
     * @param  Request  $request
     * @param  Post  $post
     * @return Response
     * @throws \Illuminate\Auth\Access\AuthorizationException
     */
    public function update(Request $request, Post $post)
    {
        $this->authorize('update', $post);//也可以使用Gate::authorize('update', $post);
      //如果使用以上兩個都報錯this action is unauthorized,那就使用方法一
        // 當前用戶可以更新博客....
    }
}

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM