本文实例讲述了thinkPHP5 ACL用户权限模块用法。分享给大家供大家参考,具体如下:
最近学习thinkphp5,和以前3.X版本是完全不是一个概念。学习thinkphp5的朋友要注意命名空间思想。
最近做的一个项目,一个检测管理系统,由于为了以后做APP需要,才切换到thinkphp5作为以后的扩展API用的。今天完成的是用户权限控制模块。我把这个mark下来
数据库:
role数据库表:
1
2
3
4
5
6
7
8
9
10
|
`id` int (11) unsigned NOT NULL AUTO_INCREMENT, ` name ` varchar (20) NOT NULL COMMENT '角色名称' , `pid` smallint (6) DEFAULT NULL COMMENT '父角色ID' , `rule_name` text COMMENT '规则唯一英文标识,全小写' , `type` varchar (50) DEFAULT '' COMMENT '权限规则分类,请加应用前缀,如admin_' , `status` tinyint(1) unsigned DEFAULT NULL COMMENT '状态' , `remark` varchar (255) DEFAULT NULL COMMENT '备注' , `create_time` int (11) unsigned NOT NULL DEFAULT '0' COMMENT '创建时间' , `update_time` int (11) unsigned NOT NULL DEFAULT '0' COMMENT '更新时间' , `listorder` int (3) NOT NULL DEFAULT '0' COMMENT '排序字段' , |
auth_rule数据库表:
1
2
3
4
5
6
7
8
|
`id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT COMMENT '规则id,自增主键' , `module` varchar (20) NOT NULL COMMENT '规则所属module' , `type` varchar (30) NOT NULL DEFAULT '1' COMMENT '权限规则分类,请加应用前缀,如admin_' , ` name ` varchar (255) NOT NULL DEFAULT '' COMMENT '规则唯一英文标识,全小写' , `param` varchar (255) DEFAULT NULL COMMENT '额外url参数' , `title` varchar (20) NOT NULL DEFAULT '' COMMENT '规则中文描述' , `status` tinyint(1) NOT NULL DEFAULT '1' COMMENT '是否有效(0:无效,1:有效)' , `condition` varchar (300) NOT NULL DEFAULT '' COMMENT '规则附加条件' , |
用户表里面增加:
1
2
|
`pools` varchar (20) DEFAULT '' COMMENT '权限池' , `roleId` smallint (5) NOT NULL DEFAULT '0' COMMENT '权限id' , |
代码如下:
iAuth.php 权限认证的公共库文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
|
class iAuth{ public $user = null; //默认配置 protected $_config = array ( ); public function __construct() { } /** * 检查权限 * @param name string|array 需要验证的规则列表,支持逗号分隔的权限规则或索引数组 * @param uid int 认证用户的id * @param relation string 如果为 'or' 表示满足任一条规则即通过验证;如果为 'and'则表示需满足所有规则才能通过验证 * @return boolean 通过验证返回true;失败返回false */ public function check( $uid , $name , $relation = 'or' ) { if ( empty ( $uid )){ return false; } if ( $uid ==1){ return true; } if ( is_string ( $name )) { $name = strtolower ( $name ); if ( strpos ( $name , ',' ) !== false) { $name = explode ( ',' , $name ); } else { $name = array ( $name ); } } $list = array (); //保存验证通过的规则名 //获取用户信息 $this ->getUserInfo( $uid ); //获取用户信息,一维数组 $groups = $this ->user[ 'roleId' ]; if (in_array(1, $groups )){ return true; } if ( empty ( $groups )){ return false; } $rules = self::get_rules( $this ->user[ 'roleId' ]); if (in_array( $name , $rules )) { return true; } return false; } /** * 获得用户资料 */ private function getUserInfo(& $uid ) { if (!isset( $this ->user)){ $user = new Users( $uid ); $this ->user = $user ->fields; } return $this ->user; } /** * 获取验证规则 * @param int $id */ public static function get_rules( $id ) { if ( empty ( $id )) return false; $rules = Cache::get(self:: $cache_prefix . $id ); if ( empty ( $rules )) { $model = Db::name( 'role' ); $model ->where( 'id' , $id ); $rules = $model ->find(); $rules [ 'rule_name' ] = explode ( ',' , strtolower ( $rules [ 'rule_name' ])); //设置缓存 Cache::set(self:: $cache_prefix , $rules ); } return $rules ; } } |
Common.php 通用函数类库
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
/** * 检测用户id * @param name string|array 需要验证的规则列表,支持逗号分隔的权限规则或索引数组 * @param uid int 认证用户的id */ function sp_auth_check( $uid , $name =null) { if ( empty ( $uid )) return false; if ( empty ( $name )){ $name = strtolower (MODULE_NAME. "/" .CONTROLLER_NAME. "/" .ACTION_NAME); } $iAuth_obj = new \app\Common\Lib\iAuth(); return $iAuth_obj ->check( $uid ); } |
AdminbaseController.php 后台管理的父控制器类
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
|
class AdminbaseController extends Controller { public $uid = 0; //用户实例 public $userObj = null; /** * 构造函数 * Adminbase constructor. */ public function __construct() { parent::__construct(); } public function _initialize() { $this ->uid = Session::read( 'AdminId' ); if (! empty ( $this ->uid )) { //检测过已经登录了 $this ->userObj = Db::name( 'users' )->where( 'uid' , $this ->uid)->find(); if (! $this ->check_access( $this ->uid)) { $this ->error( "您没有访问权限!" ,Url::build( 'admin/index/login' )); exit (); } $this ->assign( 'admin' , $this ->userObj); } else { //没有登录的 $this ->error( "您还没有登录!" ,Url::build( 'admin/index/login' )); exit (); } } /** * 检测权限 * @param $uid */ private function check_access(& $uid ) { if ( $uid == 1) { //超级管理员 return true; } $request = Request::instance(); //如果不是这个应用池的账户也不通过 $pools = explode ( ',' , $this ->userObj[ 'pools' ]); if (!in_array( strtolower ( $request ->module()), $pools )) return false; $rule = $request ->module() . '_' . $request ->controller() . '_' . $request ->action() ; $no_need_check_rules = Config::get( 'inc_auth.no_need_check_rules' ); if (!in_array( strtolower ( $rule ), $no_need_check_rules )) { //验证权限 return sp_auth_check( $uid ); } else { return true; } } } |
inc_auth.php 认证配置文件
1
|
$config [ 'no_need_check_rules' ] = array ( 'admin_index_index' , 'admin_index_login' ); |
希望本文所述对大家基于ThinkPHP框架的PHP程序设计有所帮助。