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 权限并且它工作正常。我希望它能帮助你。谢谢