RBAC项目

实体间的关系

现在有三个实体:用户、角色、权限,首先我们搞清楚他们之间的关系是什么
用户有:张三、李四、王五
角色有:员工、经理、老板
权限有:删帖、看帖、
RBAC 基于角色的权限控制
RBAC模型的优势简化了用户和权限的关系
涉及到三个模型 用户模型 角色模型 权限模型

RBAC流程图在这里插入图片描述
多对多关系:一个用户对多个角色,一个角色对多个权限

在这里插入图片描述1.数据库设计
在这里插入图片描述
角色表
blog_role
id role_name
权限表
blog_permission
id per_name per_url
角色关联权限表
blog_role_premission
role_id permission_id
用户关联角色表
blog_user_role
user_id role_id
先做添加再做展示然后做授权

//授权方法
     public function  auth($id)
     {
         $role=Role::find($id);//通过$id获取当前角色
         $perms=Permission::get();//获取所有权限列表
         $own_perms=$role->permission;//获取当前角色拥有的权限 在我们的角色模型增加一个动态属性
         //角色拥有的权限id
         $own_pers=[];
         foreach ($own_perms as $v){
             $own_pers[]=$v->id;
         }
        return  view('admin/role/auth',compact('perms','role','own_pers'));
     }
  在角色模型写
 public function permission()
    {
        //添加动态属性,关联权限模型
        //多对多关系 1.关联模型 2.关联表表名 3.当前模型在关联中的外键 4.被关联模型在关联表中的主键
        return $this->belongsToMany('App\Model\Permission','blog_role_permission','role_id','permission_id');

    }
执行权限处理
public function  doauth(Request $request)
      {
          $inp=$request->except('_token()');
//          删除当前角色已有的权限
          \DB::table('blog_role_permission')->where('role_id',$inp['role_id'])->delete();
          if(!empty($inp['permission_id'])){
              //因为是数组要遍历一下
              foreach ($inp['permission_id'] as $v){
                   //添加新赋予的权限 万一传过来是个空所以要判断一下
                  \DB::table('blog_role_permission')->insert([
                      'role_id'=>$inp['role_id'],
                      'permission_id'=>$v
                  ]);
              }
          }
          return redirect('admin/role');

       }

前台复选框

 <div class="layui-input-inline" style="width:600px;">
                    @foreach($perms as $v)
                        {{--让用户拥有的权限被选中--}}
                        @if(in_array($v->id,$own_pers))
                            <input type="checkbox" name="permission_id[]" checked  value="{{$v->id}}" title="{{$v->per_name}}" lay-skin="primary" >
                        @else
                            <input type="checkbox" name="permission_id[]"  value="{{$v->id}}" title="{{$v->per_name}}" lay-skin="primary" >
                        @endif
                    @endforeach
                </div>

新建一个中间件HaRole

public function handle($request, Closure $next)
    {
          //获取当前的请求路由 对应控制器方法
        $route=$request->route()->getActionName();
//        2. 获取当前用户的权限组 我们先通过用户找到角色 
        $user = User::find(session()->get('user')->user_id);
        //获取当前用户的角色 role已经定义好了
       $roles=$user->role;
       //role是个集合不能直接找角色需要遍历一下
       //根据用户拥有的角色 找对应的权限
        $arr=[];//定义一个空数组 存放权限对应的字段per_url
//        "App\Http\Controllers\Admin\LoginController@index"
        foreach($roles as $v){
            $perms=$v->permission;//取出当前角色的权限 权限也是个集合
            foreach ($perms as $perm){
                $arr[]=$perm->per_url;
            }
        }
       //去掉重复的权限
        $arr=array_unique($arr);
        //判断当前请求的路由对应控制器的方法名是否在当前用户
//        拥有的权限列表中也就是$arr中
        if(in_array($route,$arr)){
            return $next($request);
        }else{
            return redirect('admin/noaccess');
            //需要自己写一个没有权限的页面noaccess
        }


    }
/跟Role的关联模型
    public function role()
    {
        return $this->belongsToMany('App\Model\Role','blog_user_role','user_id','role_id');
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
RBAC(Role-Based Access Control)是一种常见的权限控制模型,它将用户赋予的权限与角色相关联,而不是直接赋予用户权限。这种模型的优点是易于管理和维护。 在实现RBAC权限时,需要考虑以下几个方面: 1. 角色设计:首先需要定义系统中的角色,通常可以根据业务需求来定义,例如管理员、普通用户、VIP用户等。 2. 权限设计:其次需要定义每个角色所具有的权限,例如管理员可以访问所有资源,而普通用户只能访问部分资源。 3. 用户与角色关联:用户需要被赋予一个或多个角色,以便系统能够识别其权限。 4. 角色与权限关联:每个角色需要被赋予一组权限,以便系统能够根据角色确定用户的权限。 5. 权限验证:在用户访问资源时,需要根据其所具有的角色和权限进行验证,以确保其有权限访问该资源。 在具体实现RBAC权限时,可以采用数据库表设计的方式来存储角色、用户、权限等信息。通常会有以下几个表: 1. Role表:存储角色信息,包括角色ID、角色名称、角色描述等。 2. User表:存储用户信息,包括用户ID、用户名、密码等。 3. UserRole表:存储用户与角色的关联信息,包括用户ID、角色ID等。 4. Permission表:存储权限信息,包括权限ID、权限名称、权限描述等。 5. RolePermission表:存储角色与权限的关联信息,包括角色ID、权限ID等。 在实现RBAC权限时,需要注意以下几点: 1. 需要对用户输入的数据进行验证和过滤,以避免SQL注入等安全问题。 2. 需要确保角色、用户、权限等信息的一致性和完整性,例如添加用户时需要保证其所属角色存在。 3. 需要对数据进行备份和恢复,以避免数据丢失或损坏。 4. 需要确保系统的性能和可靠性,例如采用索引等技术来提高查询效率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值