角色权限管理是一个很常见的系统功能,通常包含用户管理、菜单管理、角色管理、权限管理等部分。在ThinkPHP框架中,官方曾推出RBAC和AUTH两种方式来实现。
在RBAC方式中,作者设计了用户表、权限表、节点表、角色表和用户角色表五张表,大概步骤是:先根据功能创建节点(实际上就是模块、控制器、方法);然后创建角色,并为角色分配权限(就是将节点与角色关联起来),待角色创建完毕后,创建用户,并为用户分配角色;最后,当用户登录成功后,获取用户的角色,以及角色关联的权限,通过判断当前访问的模块、控制器和方法是否存在其中,来决定当前登录用户对当前访问的模块、控制器和方法是否拥有权限。
RBAC的设计决定了它只能进行较为粗糙的,而非精细(比如对用户属性)的权限判断。为解决这个问题,作者又设计了AUTH方式。
在AUTH方式中,作者设计了用户表、用户与权限分组关联表(相当于RBAC中的用户角色表)、权限分组表(相当于RBAC中的角色表)和权限规则(相当于RBAC中的节点表)表四张表,大概的步骤与RBAC方式很相似,也是先创建权限权限规则;然后创建权限分组,并分配权限规则,待权限分组创建完毕后,创建用户,并为用户分配权限分组;最后,当用户登录成功后,获取用户的权限分组,以及权限分组关联的权限规则,通过判断用户的属性与权限规则是否匹配,来决定当前登录用户对当前操作是否有权限。
既然ThinkPHP可以实现角色权限管理,那同为PHP框架的Laravel,是否也可以实现角色权限管理呢?答案肯定是可以的,自诩让PHP程序员诗一样编程的Laravel怎么可以能不行呢。
在Laravel中,要实现RBAC角色权限管理,可以借助扩展包Laravel Permission 。具体操作步骤可以参考下面的文档:
http://laravelacademy.org/post/9389.html
在上面的文档中有详细的操作步骤,大家只要按照说明操作,一般是可以顺利搭建起简单的角色权限管理系统的。如下图所示:
本文要提醒的是,虽然Laravel permission可以实现角色权限管理,但若你使用了,你就会发现,要想能自己的项目中使用,自己还是得修改修改的。首先,它没有关联菜单操作,无法根据权限显示菜单;其次,它的权限判断没有跟路由关联起来,不够灵活。
针对以上问题,在这里我介绍下,我的思考。
参考ThinkPHP中RBAC的实现,在创建权限permission的时候,我们将对应功能的路由,即route()中的参数部分,保存至name值。当用户登录成功后,获取用户角色及对于权限,判断当前功能的路由是否存在于其权限中,若存在,则表示当前登录用户拥有权限,否则表示没有权限。
在菜单部分,我们在创建菜单的时候,将菜单与对应的权限节点关联起来,与判断权限一样,判断哪些菜单与用户的权限有关联,有关联的显示出来,没有管理的则隐藏。
至此,Laravel框架实现RBAC角色管理就完成了。至于要实现AUTH方式,则原理与此几乎一致,大家可以举一反三。