权限验证
权限验证使用 permission类,需配置权限表,位于实例cfg目录下(如:/www/cfg/perm.php),支持按组定义多个权限表,每个表支持allow(允许)和deny(拒绝)两项
- perm.php:默认权限表
- perm-*.php:组权限表,*为组标识
实际中可以使用数据库来管理权限,使用程序来生成权限表
权限定义
可以通过对动作访问的限制来达到权限控制,每个权限项(模块.控制器.动作)支持任意位置使用通配符*,省略的节点均代表*,多个权限项之间用逗号(,)隔开。权限规则测试工具
'allow' => '*',
'deny' => 'admin.*.do_*,
user.news.*'
出于性能考虑,尽可能的使用通配符*,减少定义项目
权限验证
验证时将当前权限(模块.控制器.动作)与用户所在组或默认权限表进行校验
public function __construct(){
/* 检测登录,获取Session中用户组$group_id */
boa::permission()->validate($group_id, 'a'); // 对用户组(group_id=1)使用perm-1.php权限表验证,并指定验证模式
}
实际中可能不想每个动作中都要写一次验证,可以放在common共用库或各控制器 __construct() 中
验证模式
选择验证模式主要基于权限表设计便捷性来决定,就是选择某种模式,权限规则写的更少更方便更符合需求。 以下对于动作 admin.news.add 的验证来举例:
模式 | 说明 | 例子 | 解释 |
---|---|---|---|
a | 只验证allow权限,匹配则通过,否则拒绝 |
| 全部允许,匹配所以通过 |
d | 只验证deny权限,匹配则拒绝,否则通过 |
| 全部拒绝,匹配所以拒绝 |
ad | 先验证allow再验证deny,各自含义同前 |
| 前者通过而后者拒绝,所以拒绝;如果前者拒绝则不验证后者,直接拒绝;对于允许多拒绝少的情况,采用这种模式权限规则写的少,先全部允许然后指定少量具体的拒绝 |
da | 先验证deny再验证allow,各自含义同前 |
| 前者拒绝而后者通过,所以通过;如果前者通过则不验证后者,直接通过;对于允许少拒绝多的情况,采用这种模式权限规则写的少,先全部拒绝然后指定少量具体的允许 |
开发中遇到权限表修改后不生效的问题,请先尝试删除临时目录下的缓存(var/www/cache/)