公司内部一直是在用ThinkPHP,最近偶然间接触CI,感觉不错,公司内部使用ThinkPHP用了他们官方示例的RBAC,最近花时间根据CI的一些特性以及ThinkPHP RBAC的基本理念,用CI实现了一套,说是RBAC,其实不只是权限控制,导航菜单的定制以及RBAC的后台页面化管理都已经初步完工了,下面就来看看最初版本。
整个RBAC基本上就是RBAC0的模型,甚至比他更简单,用到的CI钩子-扩展框架的核心。
先看一下RBAC的配置文件,这基本上就是这个的辅助功能了。关于rbac_manage_menu_hidden,rbac_manage_node_hidden这是在使用think的rbac时感觉别扭的地方,RBAC的管理也是根据自身的这套架构来控制的,但是根本没人去再对其进行操作,每次显示在后台特别别扭,所以这里增加两个参数,可以使不想显示在后台的管理节点以及菜单显示。
1 | $config['rbac_auth_on'] = TRUE; //是否开启认证 |
下面小讲一下代码和原理
config/hooks.php增加
1 | $hook['post_controller_constructor'] = array( |
post_controller_constructor在你的控制器实例化之后,任何方法调用之前调用权限检测,display_override这个主要是方便显示用的,关于最后的pre_system调用的session_start,整个验证过程都要用到session,而我实在是没有找到好地方调用,只能放在这里了,不知道ci是不是有啥参数之类的能直接开启?
下面是关于aoto_verify的验证的方法,与ThinkPHP是类似的,Think是继承Action自己写的一个Action,以后所有的方法都再集成,既然有了CI的钩子,就不需要那么费劲了,ThinkPHP验证的是分组/模块/方法,在CI中验证的是目录/控制器/方法。为了更方便的取到上面的数据,使用CI的get_instance获取超级对象,然后调用$ci_obj->router就可以了。
aoto_verify()
1 | public function aoto_verify(){ |
PS:在这里只对controllers中的二级目录做了权限控制,一级没有。在上述方法后,还有一句$this->get_menu(),这里是获取左侧的导航菜单数据。
get_menu()
1 | $ci_obj = &get_instance(); |
关于这个方法其实就是数组的拼接以及是否显示的验证。
关于数据库,一共5张表,4张表实现权限的控制,1张表主要是左侧的菜单,各表之间的关系还是比较明了简洁的
1 |
|
OK,CI刚刚接触,可能有些地方使用不当,这个在后期在进行改版。 PS这里我用的CI版本为2.1.4
样式使用的bootstrap3.0,