laravel - 针对用户不同角色的基于角色的身份验证
问题描述
我正在使用 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);
}
如何检查特定角色是否可以访问特定菜单?
提前致谢
解决方案
您可以在用户和角色中检查这一点...我会在用户模型中进行
像这样的东西应该在用户模型中工作......对于角色,只需删除与用户相关的表。
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;
}
推荐阅读
- android - 如何在外部存储中剪切音乐文件
- javascript - 带有重复的 GSAP 时间线打破了可拖动的缓动流程
- javascript - 根据列表项单击显示图像
- jupyterhub - 我在远程服务器上安装了一个 jupyterhub,但是当我访问它时,它显示 jupyter notebook,而不是 jupyter lab
- azerothcore - 更新艾泽拉斯之核,现在无法启动。MySQL 错误“‘字段列表’中的未知列‘innTriggerId’”
- regex - 如何在linux中使用正则表达式获取具有6个字符长的名字和姓氏
- postgresql - 为什么这个简单的 TypeORM 查询不能用 PostgreSQL 返回我的 ManyToOne 属性?
- java - 如何从数组列表中删除具有特定值的对象?
- python - 安装 web3.py 错误:命令“cl.exe”失败:没有这样的文件或目录
- typescript - vscode 的 openTextDocument 关闭标签和窗口