rabc 权限控制
最简单设计方案 三张表 用户表 角色表 权限表

用户表的角色id 对应角色表中 id
角色表中的权限id 是字符串,根据逗号分隔,对应的权限表id
三个表,满足普通 的要求。
业务比较复杂时,推荐使用四个表 操作
多了一个 角色与权限的中间表 进行管理和操作
1.数据表
user 用户表
$table->bigIncrements('id');
$table->unsignedBigInteger('role_id')->default(0)->comment('角色id');
$table->string('username',50)->comment("账号");
$table->string('truename',255)->default('')->comment("真实姓名");
$table->string('password',255)->comment("密码");
//nullable 可以为空
$table->string('email',50)->nullable()->comment('邮箱');
$table->string('phone',15)->default('')->comment('手机号');
$table->enum('sex',['先生','女士'])->default('先生')->comment('性别');
role 角色表
$table->bigIncrements('id');
$table->string('name',50)->comment('角色名称');
权限表
$table->string('name',50)->comment('名称');
// nullable 可以为空
$table->string('route_name',100)->nullable()->default('')->comment('路由别名/权限认证');
$table->unsignedBigInteger('pid')->default(0)->comment('上级菜单');
$table->enum('is_menu',['0','1'])->default('0')->comment('是否是菜单0否1是');
$table->timestamps();
权限和角色关联表
//角色id
$table->unsignedBigInteger('role_id')->default(0)->comment('角色id');
//权限id
$table->unsignedBigInteger('node_id')->default(0)->comment('权限id');
主要记录下 模型操作
1.角色和权限 关联
读取 已经设置的权限id 和 所有的权限 节点数据,
/**
*角色 权限控制
*/
public function node(Role $role)
{
//获取当前 已经设置的权限id'
$nodes = $role->nodes()->pluck('id')->toArray();
//获取所有的权限
$nodeall = (new Node())->getAllLevel();
return view('admin.role.node',compact('role','nodes','nodeall'));
}
nodes() 是多对多模型 操作
在role表 进行操作具体模型方法如下
因为是多对多 使用belongstomany
//角色和权限关联模型
public function nodes(){
//多对多
// 1. 关联的模型
// 2. 关联表中间表
// 3.本模型对应的外键id
// 4.关联模型对应的外键id
return $this->belongsToMany(
Node::class,
'role_node',
'role_id',
'node_id'
);
}
获取所有的权限 节点 ,这个地方需要递归,查询对应的子权限,组装对应的数据
//获取权限节点 层级关系
public function getAllLevel(){
//获取所有的 权限 self::all()->toArray()
return $this->treelevel(self::all()->toArray());
}
//递归 查询权限节点 层级关系
public function treelevel($data,$pid=0,$html="--",$level=0){
static $arr =[];
foreach ($data as $value){
//当前循环的pid 和 传入的pid相同时 进行操作 默认为0 就是一级权限列表
if($value['pid'] == $pid){
// 等级
$value['level'] = $level+1;
//重复一个字符多少次 设置名称
$value['name'] = str_repeat($html,$level*2).$value['name'];
$arr[]=$value;
//查找 对应子权限
$this->treelevel($data,$value['id'],$html,$value['level']);
}
}
return $arr;
}
最终效果
处理操作
/**
*角色 权限操作
*/
public function nodesave(Request $request, Role $role)
{
if($request->wantsJson()){
// sync 可以将之前是删除,然后在更新 模型操作 很方便
$re = $role->nodes()->sync($request->get('node'));
if($re){
return $this->reSuJson('成功');
}
return $this->reErJson('失败');;
}
return view('admin.role.index');
}
`用户 和角色 操作
一对一 一个用户对应一个角色
//角色分配
public function role(Request $request,int $id){
//当前用户角色
$user = User::find($id);
//判断是否是 修改操作
if($request->isMethod('post')){
$post = $this->validate($request,[
'role_id'=>"required"
]);
//修改 角色id
$re = $user->update($post);
if($re){
return $this->reSuJson('成功');
}
return $this->reErJson('失败');
}
//获取所有的校色
$roleAll = Role::all();
return view('admin.user.role',compact('user','roleAll'));
}
最终效果
角色 权限 用户表 三个表权限 关联操作完成。
菜单 权限操作 后面更新