第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

允許根據(jù)設置的權限以及 Laravel 中模型的屬性值編輯模型

允許根據(jù)設置的權限以及 Laravel 中模型的屬性值編輯模型

PHP
陪伴而非守候 2023-06-30 16:05:03
我有一個位置模型,其中包含兩個屬性:ID 和名稱。為了編輯這個模型,我設置了這條路線:Route::get('administration/location/{location}/edit', 'LocationController@edit')->name('location.edit');我設置了非常簡單的權限:在AuthServiceProvider我正在檢查boot以下方法中Gate::before(function ($user, $permission) {    if ($user->permissions->pluck('name')->contains($permission)) {        return true;    }});其中permission是包含 ID 和名稱的模型,通過permission_user表映射。我設置了這些權限:編輯洛杉磯編輯紐約編輯波士頓與位置無關的大量其他權限經(jīng)過所有這些漫無目的的討論,我真正的問題是:如何將這些權限與編輯位置聯(lián)系起來?我面臨的問題是,不允許給定用戶編輯所有位置,而只能允許編輯一個位置。只有具有權限的用戶edit_los_angeles才可以編輯Location名稱為 的文件Los Angeles。因此,我無法將其分組為一個權限,例如edit_location并將其添加到我的路線中->middleware('can:edit_location')。相反,我想我需要這樣的東西:Route::get('administration/location/{location}/edit', 'LocationController@edit')->name('location.edit')->middleware('can:edit_los_angeles');Route::get('administration/location/{location}/edit', 'LocationController@edit')->name('location.edit')->middleware('can:edit_new_york');Route::get('administration/location/{location}/edit', 'LocationController@edit')->name('location.edit')->middleware('can:edit_boston');...顯然這是行不通的。你會采取什么方法來解決這個困境?:-)也許我做的事情完全錯誤,并且有更好的 Laravel-Way 來做到這一點?非常感謝您提前提供的幫助!我正在使用 Laravel 6.0 :-)
查看完整描述

2 回答

?
FFIVE

TA貢獻1797條經(jīng)驗 獲得超6個贊

我的工作方法有兩個假設,在控制器中使用模型綁定(無論如何你都應該這樣做)。其次,位置與其所需的權限之間需要存在某種關系,類似于您建議的slug。


你的控制器功能看起來像這樣。添加 FormRequest 是執(zhí)行此邏輯的好方法。


class LocationController {

     public function edit(EditLocationRequest $request, Location $location) { // implicit model binding

         ...

     }

}

為了方便使用,我也會制定一個政策。


class LocationPolicy

{

    public function edit(User $user, Location $location) {

        return $user->permissions->pluck('name')

            ->contains($location->permission_slug); // assuming we have a binding

    }

}

請記住在 中注冊策略AuthServiceProvider.php。


protected $policies = [

    Location::class => LocationPolicy::class,

];

現(xiàn)在,在您的表單請求中使用授權方法中的策略。從這里,您處于請求上下文中,您可以訪問用戶,$this->user()并且可以訪問在其名稱上綁定模型的所有模型,例如$this->location。


class EditLocationRequest

{

    public function authorize(): bool

    {

        return $this->user()->can('edit', $this->location);

    }

}

現(xiàn)在您應該只能有一個路由定義。


Route::get('administration/location/{location}/edit', 'LocationController@edit')->name('location.edit');

編輯


如果您使用 AuthorizesRequests 特征,則無需表單請求即可執(zhí)行以下操作。這將拋出一個 AuthorizationException 失敗。


use AuthorizesRequests;


public function edit() {

    $this->authorize('edit', $location);

}


查看完整回答
反對 回復 2023-06-30
?
qq_遁去的一_1

TA貢獻1725條經(jīng)驗 獲得超8個贊

如果您有基于位置關系的要求,那么您將需要在數(shù)據(jù)中捕獲該關系。一個好的起點是添加特定于這些編輯權限的數(shù)據(jù)透視表??紤]一個表,location_permissions,帶有 auser_id和 a location_id。然后,一旦您擁有特定的用戶和位置,您就可以修改或添加權限中間件來檢查此表中的記錄。


編輯:回答有關中間件實現(xiàn)的問題,


通過這個新的數(shù)據(jù)透視表定義用戶模型與位置的關系可能會解決實現(xiàn)的關鍵問題。


我建議添加一個額外的方法,該方法locations按照以下方式消耗與模型的新關系


public function canEditLocation(Location $location): bool { 


   return $this->locations

               ->where('location_id', '=', $location->id)

               ->count() > 0; 

    }

實際的中間件是這樣的:


public function handle($request, Closure $next, $location)

    {

        if (! $request->user()->canEditLocation($location)) {

            \\handle failed permission as appropriate here.

        }


        return $next($request);

    }

我的中間件參數(shù)知識很生疏,但我相信這是正確的,如https://laravel.com/docs/master/middleware#middleware-parameters中定義的那樣


查看完整回答
反對 回復 2023-06-30
  • 2 回答
  • 0 關注
  • 146 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網(wǎng)微信公眾號