boaPHP开发手册v5.5

权限验证

权限验证使用 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权限,匹配则通过,否则拒绝
'allow' => '*'
全部允许,匹配所以通过
d只验证deny权限,匹配则拒绝,否则通过
'deny' => '*'
全部拒绝,匹配所以拒绝
ad先验证allow再验证deny,各自含义同前
'allow' => '*',
'deny' => 'admin.news.*'
前者通过而后者拒绝,所以拒绝;如果前者拒绝则不验证后者,直接拒绝;对于允许多拒绝少的情况,采用这种模式权限规则写的少,先全部允许然后指定少量具体的拒绝
da先验证deny再验证allow,各自含义同前
'deny' => '*',
'allow' => 'admin.news.*'
前者拒绝而后者通过,所以通过;如果前者通过则不验证后者,直接通过;对于允许少拒绝多的情况,采用这种模式权限规则写的少,先全部拒绝然后指定少量具体的允许

开发中遇到权限表修改后不生效的问题,请先尝试删除临时目录下的缓存(var/www/cache/)