我正在使用 Laravel 8.5,我想開發自己的 ACL。
所以我在權限和用戶模型之間建立了這種多對多關系:
用戶.php:
public function permissions()
{
return $this->belongsToMany(Permission::class);
}
權限.php:
public function users()
{
return $this->belongsToMany(User::class);
}
然后我將此自定義權限插入到permissions表中:

然后將其也插入到資料透視表中pemrission_user:

然后web.php,我嘗試了這個:
Route::get('/', function () {
$user = auth()->user();
// dd($user->permissions()->get());
if(Gate::allows('edit-user')){
dd(2);
}else{
dd(1);
}
});
所以我嘗試檢查登錄的用戶是否有權限edit-user,然后顯示2作為結果,但現在它以某種方式回傳1,這意味著用戶沒有這個權限!
但是,如果我取消注釋dd($user->permissions()->get());,我可以看到:

因此,它顯示用戶已經擁有此edit-user權限,但我不明白為什么 Gate 在這種情況下不授權用戶。
所以如果你知道,我求你幫助我,因為我真的不知道如何解決這個問題......
uj5u.com熱心網友回復:
您還需要edit-user為 Gate 定義,因為您的權限模型目前對 Gate 沒有任何意義。
Gate::define('edit-user', function (User $user) {
return $user->permissions()->whereName('edit-user')->exists();
});
更多資訊可以在這里找到:https ://laravel.com/docs/8.x/authorization#writing-gates
否則,您可以使用策略:
class UserPolicy
{
public function update(User $user)
{
return $user->permissions()->whereName('edit-user')->exists();
}
}
然后允許用戶:
$user->can('update', User::make());
有關政策的更多資訊,請參見:https ://laravel.com/docs/master/authorization#creating-policies
Spatie 還提供了一個名為laravel-permission的開源軟體包,您可以查看以了解更多資訊。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/461960.html
標籤:php 拉拉维尔 授权 laravel-8 laravel 门
