php">fleaphp提供了现成的权限解决方案——RBAC,下面我把如何使用RBAC完成权限操作进行一个
简单的介绍。
使用该解决方案可以达到的效果如下:
1 如用户进入需验证的页面时没有登陆,则跳出出错页面(出错页面需要自己定义,下同)。
2 可设置某一个Controller为全部需要验证,或者全部不需要验证。
3 可设置某一个Controller需要以哪几种身份登陆后才可以使用。
4 可设置某一个Controller中的哪些Action需要验证,哪些Action不需要验证。
5 可设置某一个Controller中的一个Action需要以哪几种身份登陆后才可以使用。
6 个人觉得,FleaPHP里的RBAC已经将权限里所需要的绝大多数情况都考虑进去了,值得大家花时间了解一下。
介绍之前先说明一下,我假设看这篇文章的人已经有了一定的PHP及FleaPHP的使用基础,文章
中不会描述如何解决一些基本的问题。但,我会尽量以我理解的方式给每一步做出一些说明文字。
希望这样会对大家有所帮助。
我们先来看一张图(感谢tsingson,这图和我所讲的大部分内容都是他教我的)

从上图中,我们可以看见RBAC在整个过程中起到什么作用。而这篇文章就是讲述在FleaPHP中如何调用RBAC。
在你希望进行权限设定的那个调度器(index.php)里加上如下代码:
- //应用程序要使用的 url 调度器,默认的是FLEA_Dispatcher_Simple
- set_app_inf('dispatcher','FLEA_Dispatcher_Auth');
- //默认权限参数文件 其中 FILE_PATH为你安装FleaPHP的路径,默认为null
- //SHOP例子里是这么设定的
- //'defaultControllerACTFile' => dirname(__FILE__) . DS . 'DefaultACT.php',
- //只要能出来都行
- set_app_inf('defaultControllerACTFile', FILE_PATH . '/Config/DefaultACT.php');
- //用户没有权限访问控制器或控制器方法时,要调用的处理程序
- set_app_inf('dispatcherAuthFailedCallback', 'ON_DOOR');
- //指示 RBAC 组件是否在没有找到控制器的 ACT 文件时,是否使用默认 ACT,系统默认为 false
- set_app_inf('autoQueryDefaultACTFile', true);
以上这些设定,也可以在你自己的(不要去动FleaPHP自带的那个)Default_APP_INF.php文件里完成********
然后是写下你的ON_DOOR函数,个人建议也放在调度器里比较合理。
- function ON_DOOR()
- {
- die('没有权限');
- }
- //这里自由定义你希望的页面
在这里给出tsingson的建议,个人觉得比较友好。
1 先显示“没有权限,需要注册会员身份并需要登录....", 给用户一个友好的反馈
2 接着 记录用户当前 URL, 以作为登录成功后,直接跳转到这个 URL ,让用户操作连续
3 最后,显示登录界面
如果你的登陆系统不是按照FleaPHP标准来的。我的意思是,你使用了属于自己的那一套判断
用户是否登陆,用户的权限是什么。那么,你需要进行以下操作。如果已经使用了FleaPHP的标准,
那就直接跳过这一步。
在你的登陆模块里增加以下内容,以便让RBAC可以正常运行。
- $tmpRBAC = array();
- //这里是用户名
- $tmpRBAC['USERNAME'] = $user['uid'];
- //这里是用户表的primaryKey ID
- $tmpRBAC['ID'] = $user['id'];
- //这里是你所设定的权限等级
- $tmpRBAC['RBAC_ROLES'][0] = 'SYSTEM_ADMIN';
- //指示 RBAC 组件用什么键名在 session 中保存用户数据(可以直接设定,默认值为RBAC_USERDATA)
- $tmpKey = get_app_inf('RBACSessionKey');
- $_SESSION[$tmpKey] = $tmpRBAC;
最后编辑DefaultACT.php文件,大致上如下样子。
- <?php
- return array(
- Login' => array(
- 'allow' => RBAC_EVERYONE,
- 'Add' => array(
- 'allow' => 'SYSTEM_ADMIN',
- ),
- ),
- 'Manage' => array(
- 'allow' => RBAC_EVERYONE,
- 'deny' => RBAC_NO_ROLE,
- ),
- );
- ?>
简单说明一下Login,Manage都是Controller,对他们进行设定,就是对该Controller的权限进行设定。
大家注意,Login里有一个Add,这是指Login里的某一个方法,在这里,设定为只有SYSTEM_ADMIN才
可以操作。



