权限管理RBAC

基于角色的访问控制(Role-Based Access Control

项目的框架用的是优雅的Laravel,这里打算基于Laravel写一个权限管理系统

建表:

Table Users( 用户表 )

id name phone email password
1 foo 8888 8888@qq.com md5(123456)

Table Roles( 角色表 )

id role level permission
1 admin 0 1,2,3
2 user 1 4,5
3 user 2 4,5,6

Table UserRole( 用户-角色关系表 )

id user_id role_id permission
1 1 2 4,6

Table Permissions( 权限表 )

id parent_id name url
1 0 后台首页 backend
2 0 权限管理 permissionManagement
3 0 员工信息 stuffManagement
4 0 个人信息 myInfo
5 4 个人相册 photograph
6 0 其他模块 module

思路:

在项目登录的使用者分用户( user )和管理员( admin ),其中用户又分等级。这样可以适用于按用户的等级分配权限。

用户表( Users )只存放用户的相关信息,有用户名( name )、手机号( phone )、电子邮箱( email )字段。
角色表( Roles )只存放角色的信息,有角色名( role )、角色对应的权限( permission )。

用户角色关系表( UserRole )用来连接两个表,字段有user_id对应用户、role_id对应角色,这里我又加了一个权限字段( permission )。这个字段是实际分配给用户的权限,在获取用户权限的时候也是获取关系表中的权限字段。这是为了更自由的分配给用户权限,如果需要减少或增加某个用户的权限时修改的是这个字段的值。
上面表的示例中,permission字段值为“4,6”,这表示user_id为1,角色为user等级为1的用户只有访问个人信息和其他模块的权限,个人信息的二级菜单个人相册( photograph )的权限并不拥有。

其中,权限字段( permission )的值是权限表( Permissions )的id,用“,”分隔开,组成字符串存到一个字段。

权限表( Permissions )只是存放权限得列表,字段有parent_id、权限名( name )、路由( url )。若有多级的权限,就可以自关联,parent_id存放父权限的id值。
上面表中示例的数据,id为1、2、3的数据是后台admin的路由权限,剩下的都是用户的权限。在这个表中,只是list的作用。

实现:

这里用到Eloquent的模型关联,将几个表联系起来。具体使用见Laravel文档Eloquent: 关联

route.php文件中,用户user的登录后的路由放在路由组user中,用到user的中间件。
Route:

Route::group([ ['middleware' => 'user'] ], function(){
});

Middleware:

public function (){
    $user = Session::get( 'user' );
    if(empty( $user )){
        //重定向到错误提示页面,或返回登录页
    }
    //先获取当前路由
    //再获取当前用户的角色的所有权限路由$array
    //判断是否in_array(),是则进行跳转,否则返回上页。
}

public function getPermission(){
    //获取当前用户的角色的所有权限
}

UserController:

public function login(Request $request){
    $phone = $request->input( 'phone' );
    $password = $request->input( 'password' );

    $res = User::where( ['phone' => $phone, 'password'=> $password] )->first();
    if(empty($res)){
        return false;
    }
    $arr = User::getUserPermission($res);
    return $arr;
}

Model/User:

public function getUserPermission($object){
    if(empty($res)){
        return false;
    }else{
        //获取UserRole表中permission的权限,和用户其他信息组成数组$array存于Session中
        Session::set( 'user', $array );
        return $array;//并返回数组
    }
}

后台权限管理

两个模块,用户管理、权限管理

用户管理

这个模块管理用户的所有信息,并且可以添加或去掉某项权限。也可以为不同的用户级别,定制添加个别权限,以达到人性化。当然这个权限存储于UserRole关系表中,

权限管理

这个模块管理所有的权限,可以增删改现有的基本的权限名称和路由,可以增加二级的权限。

以上是我在做项目的场景中应用的权限管理,当然也希望能适用更多场景。
这里也是抛砖引玉,大家有更好的建议请务必告诉我,我也会持续优化本文。

推荐阅读更多精彩内容

  • 转自:(忘了) RBAC( Role-Based Access Control):基于角色的访问控制 RBAC支持...
    光光李阅读 962评论 0 1
  • 转自:http://www.thinksaas.cn/group/topic/150841/原文地址:http:/...
    光光李阅读 817评论 0 9
  • PHP-人员权限管理(RBAC) 权限管理可以想做vip的功能,普通用户和vip用户的功能是不一样的,大致会用到五...
    eda4468f4688阅读 390评论 0 3
  • PHP-人员权限管理(RBAC) 权限管理可以想做vip的功能,普通用户和vip用户的功能是不一样的,大致会用到五...
    司马东阳阅读 492评论 0 1
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 116,942评论 15 132