首页 > 解决方案 > 针对用户不同角色的基于角色的身份验证

问题描述

我正在使用 laravel 5.5 为用户开发基于角色的身份验证。系统用户可以有多个角色,这些角色可以访问多个菜单。我想检查用户的当前角色是否可以访问特定菜单。

以下是我的表结构

Schema::create('users', function (Blueprint $table) {
        $table->increments('id');
        $table->string('name');
        $table->string('email')->unique();
        $table->string('password');
        $table->rememberToken();
        $table->timestamps();
        $table->dateTime('deleted_at')->nullable(); 
    });

     Schema::create('roles', function (Blueprint $table) {
        $table->increments('id');
        $table->string('name')->unique();
        $table->longText('description')->nullable();
        $table->timestamps();
        $table->dateTime('deleted_at')->nullable(); 
    });

      Schema::create('role_user', function (Blueprint $table) {
        $table->increments('id');
        $table->integer('user_id');
        $table->integer('role_id');
        $table->integer('is_default')->default(0);
        $table->timestamps();
        $table->dateTime('deleted_at')->nullable(); 

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

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

    Schema::create('menus', function (Blueprint $table) {
        $table->increments('id');
        $table->integer('parent_id');
        $table->string('name')->unique();
        $table->string('action')->unique();
        $table->integer('sequence');
        $table->timestamps();
        $table->dateTime('deleted_at')->nullable(); 
    });

    Schema::create('menu_roles', function (Blueprint $table) {
        $table->increments('id');
        $table->integer('menu_id');
        $table->integer('role_id');
        $table->timestamps();
        $table->dateTime('deleted_at')->nullable(); 


        $table->foreign('menu_id')
                ->references('id')->on('menus')
                ->onDelete('cascade');

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

我将关系定义如下:

用户.php

 public function roles()
{
    return $this->belongsToMany(Role::class);
}

角色.php

public function users()
{
    return $this->belongsToMany(User::class);
}

public function menus()
{
    return $this->belongsToMany(Menu::class);
}

如何检查特定角色是否可以访问特定菜单?

提前致谢

标签: laravellaravel-5.5

解决方案


您可以在用户和角色中检查这一点...我会在用户模型中进行

像这样的东西应该在用户模型中工作......对于角色,只需删除与用户相关的表。

public function checkMenuPermission($key)
{

    // YOUR KEY can be name, id, any unique column... 

    $results = DB::table('users')
                    ->join('role_user', 'users.id', '=', 'role_user.user_id')
                    ->join('menu_roles', 'role_user.role_id', '=', 'menu_roles.role_id')
                    ->join('menus', 'menus.id', '=', 'menu_roles.menu_id')
                    ->select('menus.name')
                    ->where('users.id', $this->id)
                    ->where('menus.name', $key)
                    ->orderBy('menus.name')
                    ->distinct()
                    ->get()->count();

    return $results > 0 ? true : false;
}

然后在你的控制器中就可以像这样调用它$user->checkMenuPermission('someSome');

编辑

如果你只想用Eloquent来做,你可以

public function checkMenuPermission($key){
    foreach($this->menus as $m){
      if($m->name == $key){
         return true;
      }
    }
    return false;
}

推荐阅读