Spatie 的 Laravel 权限和策略不能一起工作
Spatie's Laravel Permission and policies don't work together
请原谅我的英文,这是翻译的。我正在使用 Spatie 来控制我的应用程序的权限,例如,我必须查看、创建、更新和删除每个模块,到目前为止一切顺利,现在,我想实施策略以防止用户修改不符合要求的模型属于他。我想我遵循了文档,但我不知道它是否与 Spatie 冲突。
型号
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class Estudiante extends Model
{
use HasFactory;
.....
}
政策
namespace App\Policies;
use App\Models\Estudiante;
use App\Models\User;
use Illuminate\Auth\Access\HandlesAuthorization;
class EstudiantePolicy
{
use HandlesAuthorization;
public function view(User $user, Estudiante $estudiante)
{
//solo de prueba
return true;
}
}
AuthServiceProvider
class AuthServiceProvider extends ServiceProvider
{
...
protected $policies = [
Estudiante::class => EstudiantePolicy::class,
];
public function boot()
{
$this->registerPolicies();
Gate::before(function ($user, $ability){
return $user->account == "SuperAdmin" ?? null;
});
}
}
使用 Spatie,我检查该 CRUD 操作是否已获得授权并且它运行良好。
$this->authorize('ver-ficha-estudiante')
控制器
public function edit(Estudiante $estudiante)
{
//Tambien he probado con $user->can('view', $estudiante)
if($this->authorize('update', $estudiante)){
echo "bien";
}
}
路线
Route::group(["middleware" => ["auth"]], function()
{
Route::resource("ficha_estudiantes", FichaEstudianteController::class);
});
显然该政策从未被调用,因为并不总是返回真实的作品,我已经注册了它。
感谢任何帮助
我认为您需要更正门中的逻辑。您同时使用三元运算符和 Null 合并。我认为正确的逻辑是:
Gate::before(function ($user, $ability){
return $user->account == "SuperAdmin" ? true : false;
});
此外,我认为您不应该同时使用策略和 spatie 权限。我正在做一个项目,在这个项目中我只使用没有策略的 spatie 权限并且它工作正常。我希望它能帮助你。谢谢
请原谅我的英文,这是翻译的。我正在使用 Spatie 来控制我的应用程序的权限,例如,我必须查看、创建、更新和删除每个模块,到目前为止一切顺利,现在,我想实施策略以防止用户修改不符合要求的模型属于他。我想我遵循了文档,但我不知道它是否与 Spatie 冲突。
型号
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class Estudiante extends Model
{
use HasFactory;
.....
}
政策
namespace App\Policies;
use App\Models\Estudiante;
use App\Models\User;
use Illuminate\Auth\Access\HandlesAuthorization;
class EstudiantePolicy
{
use HandlesAuthorization;
public function view(User $user, Estudiante $estudiante)
{
//solo de prueba
return true;
}
}
AuthServiceProvider
class AuthServiceProvider extends ServiceProvider
{
...
protected $policies = [
Estudiante::class => EstudiantePolicy::class,
];
public function boot()
{
$this->registerPolicies();
Gate::before(function ($user, $ability){
return $user->account == "SuperAdmin" ?? null;
});
}
}
使用 Spatie,我检查该 CRUD 操作是否已获得授权并且它运行良好。
$this->authorize('ver-ficha-estudiante')
控制器
public function edit(Estudiante $estudiante)
{
//Tambien he probado con $user->can('view', $estudiante)
if($this->authorize('update', $estudiante)){
echo "bien";
}
}
路线
Route::group(["middleware" => ["auth"]], function()
{
Route::resource("ficha_estudiantes", FichaEstudianteController::class);
});
显然该政策从未被调用,因为并不总是返回真实的作品,我已经注册了它。
感谢任何帮助
我认为您需要更正门中的逻辑。您同时使用三元运算符和 Null 合并。我认为正确的逻辑是:
Gate::before(function ($user, $ability){
return $user->account == "SuperAdmin" ? true : false;
});
此外,我认为您不应该同时使用策略和 spatie 权限。我正在做一个项目,在这个项目中我只使用没有策略的 spatie 权限并且它工作正常。我希望它能帮助你。谢谢