首页 > 解决方案 > 如何在 Laravel Spatie 中正确使用超级管理员的角色

问题描述

正如文档中所写,我使用了 Laravel 的 Gate::before() 方法。

use Illuminate\Support\Facades\Gate;

class AuthServiceProvider extends ServiceProvider
{
    public function boot()
    {
        $this->registerPolicies();

        // Implicitly grant "Super Admin" role all permissions
        // This works in the app by using gate-related functions like auth()->user->can() and @can()
        Gate::before(function ($user, $ability) {
            return $user->hasRole('Super Admin') ? true : null;
        });
    }
}

但它不起作用。我在 web.php 中的中间件 groupe 中担任过角色,并且它的工作。“超级管理员”角色没有任何权限。

Route::group(['middleware' => ['auth:api','role:Super Admin|Provider']], function() {
  ...
}

在我的 ProviderController

class ProviderController extends Controller
{
    function __construct(){
       
        $this->middleware('permission:provider-list|provider-create|provider-edit|provider-delete', ['only' => ['index','show']]);
        $this->middleware('permission:provider-create', ['only' => ['create','store']]);
        $this->middleware('permission:provider-edit', ['only' => ['edit','update']]);
        $this->middleware('permission:provider-delete', ['only' => ['destroy']]);
        
    }

我的问题是正确的方法吗?我提前谢谢你。

标签: laravellaravel-permission

解决方案


我们经常使用 Spatie/laravel-permission ( docs )。您用于检查用户是否具有角色的代码是正确的。Spatie 的hasRole函数不关心空格或破折号。然而,该函数确实关心角色是否实际存在。确保您迁移了正确的表,并将角色实际插入到您的数据库中。

\Spatie\Permission\Models\Role::create([
  'name' => 'Super Admin',
  'guard_name' => 'web',
]);

$user->assignRole(\Spatie\Permission\Models\Role::findByName('Super Admin'));

推荐阅读