具有多个角色的 Laravel 身份验证

Posted

技术标签:

【中文标题】具有多个角色的 Laravel 身份验证【英文标题】:Laravel authentication with multiple roles 【发布时间】:2020-12-26 12:31:25 【问题描述】:

您好,我是 laravel 的初学者,我必须开发一个人力资源管理项目,我有两个角色,管理员和员工。我按照 laracast 的教程构建角色和能力表,一切似乎都在工作。现在我刚刚安装了 laravel/ui 包,我可以看到登录和注册与我在数据库中注册的用户正常工作。我现在的问题是我不知道如何将事物连接在一起。如何检查登录用户是否为管理员以便打开管理面板。等待您的回复。这是代码; 我收到的错误:419 页面已过期

这是我尝试过但不起作用的方法

protected function authenticated(Request $request, $user)
    
        // to admin dashboard
        if(auth()->user()->roles()->name === 'admin') 
            return redirect(route('admin'));
        

        // to user dashboard
        else if(auth()->user()-roles()->name === 'user') 
            return redirect(route('home'));
        

        abort(404);
    

路线

   Route::get('/', function () 
        return view('welcome');
    );
    
    Auth::routes();
    
    Route::get('/home', 'HomeController@index')->name('home');
Route::get('/admin', 'LoginController@authenticated')->name('admin');

用户表

public function up()
    
        Schema::create('users', function (Blueprint $table) 
            $table->id();
            $table->string('name');
            $table->string('email')->unique();
            $table->timestamp('email_verified_at')->nullable();
            $table->string('password');
            $table->rememberToken();
            $table->timestamps();
        );
    

创建角色表

class CreateRolesTable extends Migration

    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    
        Schema::create('roles', function (Blueprint $table) 
            $table->bigIncrements('id');
            $table->string('name');
            $table->string('label')->nullable();
            $table->timestamps();

        );

        Schema::create('abilities', function (Blueprint $table) 
            $table->bigIncrements('id');
            $table->string('name');
            $table->string('label')->nullable();
            $table->timestamps();

        );

        Schema::create('ability_role', function (Blueprint $table) 
            $table->primary(['role_id','ability_id']);

            $table->unsignedBigInteger('role_id');
            $table->unsignedBigInteger('ability_id');
            $table->timestamps();

            $table->foreign('role_id')
                ->references('id')
                ->on('roles')
                ->onDelete('cascade');

            $table->foreign('ability_id')
                ->references('id')
                ->on('roles')
                ->onDelete('cascade');
        );

        Schema::create('role_user', function (Blueprint $table) 
            $table->primary(['user_id','role_id']);

            $table->unsignedBigInteger('user_id');
            $table->unsignedBigInteger('role_id');
            $table->timestamps();

            $table->foreign('user_id')
            ->references('id')
            ->on('users')
            ->onDelete('cascade');

            $table->foreign('role_id')
                ->references('id')
                ->on('roles')
                ->onDelete('cascade');

        );
    

用户.php

public function roles()
    
        if(is_string($role))
        
            $role = Role::whereName($role)->firstOrFail();
        
        return $this->belongsToMany(Role::class)->withTimestamps();
    

    public function assignRole($role)
    
        $this->roles()->sync($role, false);
    

    public function abilities($role)
    
       return $this->roles->map->abilities->flatten()->pluck('name')->unique();
    

角色.php

class Role extends Model

    protected $guarded = [];
    
    public function abilities()
    
        return $this->belongsToMany(Ability::class)->withTimestamps();
    

    public function allowTo($ability)
    
        $this->abilities()->sync($ability,false);
    

能力.php


    protected $guarded = [];
    
    public function roles()
    
        if(is_string($ability))
        
            $ability = Ability::whereName($ability)->firstOrFail();
        
        return $this->belongsToMany(Role::class)->withTimestamps();
    

【问题讨论】:

Welcome to SO ...我不明白具体问题是什么...您似乎正在检查登录后运行的authenticated方法中的角色...。还有一切除了 return 语句应该从你的模型上的 roles 方法中删除 我不知道,但我收到错误 419 当我以管理员用户身份登录时,我似乎无法访问管理员视图 419 是一个 CSRF 令牌问题......你能提供你的路线吗?由于抛出异常,您甚至无法使用 authenticated 方法......如果您确实使用了该方法,您将遇到关于 role 方法不存在的错误 我没有使用包中的登录名 是的,现在将发布路线 【参考方案1】:

我正在使用的管理角色和权限:

"santigarcor/laratrust" 

您可以在这里了解更多信息:https://github.com/santigarcor/laratrust 你可以这样使用它:

use Illuminate\Support\Facades\Auth;

if (Auth::user()->isAbleTo('edit-user')) 
if (Auth::user()->hasRole('admin')) 
if (Auth::user()->isA('guide')) 
if (Auth::user()->isAn('admin')) 

这个包为 santigarcor/laratrust 包提供了一个用户界面

"icweb/trusty"

您可以在这里了解更多信息:https://github.com/icweb/laratrust-ui

所有表格和数据都将自动创建。

【讨论】:

嘿,这应该通过使用代码来完成,但无论如何谢谢:) 我已经尝试了很多方法来找到最佳解决方案,请尝试一下。你会发现这是最简单的方法。祝你好运!

以上是关于具有多个角色的 Laravel 身份验证的主要内容,如果未能解决你的问题,请参考以下文章

当用户在 Blazor Webassembly 身份验证和授权中具有多个角色时出现问题?

具有相同令牌的多个 Laravel-API 的 JWT 身份验证

Laravel - 具有多重身份验证的未经身份验证的重定向问题

Laravel 角色和路由身份验证

AngularJS + Laravel 5 身份验证

laravel 在角色上使用 eloquent 驱动程序进行身份验证