# thinkphp5 auth 教程 1.表结构 ~~~ DROP TABLE IF EXISTS `think_auth_group`; CREATE TABLE `think_auth_group` ( `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, `title` char(100) NOT NULL DEFAULT '' COMMENT '用户组中文名称', `status` tinyint(1) NOT NULL DEFAULT '1' COMMENT '状态 : 1为正常,0为禁用', `rules` char(80) NOT NULL DEFAULT '' COMMENT '规则ID (这里填写的是 tp_auth_rule里面的规则的ID)', PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 COMMENT='用户组表'; DROP TABLE IF EXISTS `think_auth_rule`; CREATE TABLE `think_auth_rule` ( `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT COMMENT '规则id', `name` char(80) NOT NULL DEFAULT '' COMMENT '规则名称,格式 为【模块名/控制器名/方法名】或【自定义规则】,多个规则之间用,隔开即可', `title` char(20) NOT NULL DEFAULT '' COMMENT '规则中文名称', `type` tinyint(1) NOT NULL DEFAULT '1' COMMENT '如果type为1,condition字段就可以定义规则表达式。如定义{score}>5 and {score}<100 表示用户的分数在5-100之间时这条规则才会通过。(默认为1)', `status` tinyint(1) NOT NULL DEFAULT '1' COMMENT '1为正常,0为禁用', `condition` char(100) NOT NULL DEFAULTCOMMENT '规则表达式,不为空and type字段=1 会按照条件验证 ', PRIMARY KEY (`id`), UNIQUE KEY `name` (`name`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8; DROP TABLE IF EXISTS `think_auth_group_access`; CREATE TABLE `think_auth_group_access` ( `uid` mediumint(8) unsigned NOT NULL COMMENT '用户id', `group_id` mediumint(8) unsigned NOT NULL COMMENT '组id', UNIQUE KEY `uid_group_id` (`uid`,`group_id`), KEY `uid` (`uid`), KEY `group_id` (`group_id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT ='用户组明细表'; CREATE table think_user( id mediumint(8) unsigned NOT NULL AUTO_INCREMENT, name varchar(99) , PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT ='用户表'; ~~~ 2.介绍 ~~~ 在 tp_auth_rule里面添加一个或多个验证规则用来验证你的访问权限 (Admin/Article/Add)增加文章的权限 (Admin/Article/Edit)修改文章的权限 (Admin/Article/Delete)删除文章的权限 Ps:这3个规则可以合并成一个规则,合并成一个规则的话就是: (Admin/Article/Add,Admin/Article/Edit,Admin/Article/Delete); 也可以写成(Article-Add-Edit-Delete)这样的 意思是拥有文章的增删改权限 ~~~ 3.数据录入 ~~~ -- id为1: Admin/Article/Add 增加文章的权限 -- id为2: Admin/Article/Edit 修改文章的权限 -- id为3: Admin/Article/Delete 删除文章的权限 -- id为4: Article-Add-Edit-Delete 拥有文章的增删改权限 insert into think_auth_rule (name,title) select 'Admin/Article/Add','增加文章的权限'; insert into think_auth_rule (name,title) select 'Admin/Article/Edit','修改文章的权限'; insert into think_auth_rule (name,title) select 'Admin/Article/Delete','删除文章的权限'; insert into think_auth_rule (name,title) select 'Article-Add-Edit-Delete','拥有文章的增删改权限'; -- 信息录入部门的 rules需要的规则为: 1,2,3 -- 信息审核部门需要的是:2,3 -- 信息管理部门需要的是 4 INSERT into think_auth_group (title,rules) select '信息录入部门','1,2,3'; INSERT into think_auth_group (title,rules) select '信息审核部门','2'; INSERT into think_auth_group (title,rules) select '信息管理部门','4'; -- 录入用户信息 insert into think_user (name) select '小红' union select '小明' union select '小张' union select '小李' -- 下面分配权限: -- 小红和小明是信息录入部门的: -- 那么tp_auth_access如下: -- uid为 1 的小红 所属认证部为 1(1也就是认证组表中的信息录入部门,拥有增加、修改、删除的权限) -- uid为 2 的小明 同小红一个级别(功能一样) -- uid为 3 的小张 所属认证部为 2 (2也就是认证组表中的信息审核部,拥有修改、删除的权限) -- uid为 4 的小李 所属认证部为 3 (3也就是认证表中的信息XX部 拥有信息的 增加、修改、删除的权限) INSERT into think_auth_group_access select 1,1 UNION select 2,1 union select 3,2 UNION select 4,3 ~~~ 4.权限认证类基本使用 ~~~ 1,是对规则进行认证,不是对节点进行认证。用户可以把节点当作规则名称实现对节点进行认证。 $auth=new Auth(); $auth->check('规则名称','用户id'); 2,可以同时对多条规则进行认证,并设置多条规则的关系(or或者and) $auth=new Auth(); $auth->check('规则1,规则2','用户id','and') 第三个参数为and时表示,用户需要同时具有规则1和规则2的权限。 当第三个参数为or时,表示用户值需要具备其中一个条件即可。默认为or 3,一个用户可以属于多个用户组(think_auth_group_access表 定义了用户所属用户组)。我们需要设置每个用户组拥有哪些规则(think_auth_group 定义了用户组权限) 4,支持规则表达式。 在think_auth_rule 表中定义一条规则时,如果type为1, condition字段就可以定义规则表达式。 如定义{score}>5 and {score}<100 表示用户的分数在5-100之间时这条规则才会通过。 ~~~ 6.auth 配置 ~~~ Ps:在使用auth之前,要先配置下auth所用的配置项: 如果你没修改auth_rule,auth_group,auth_group_access表名称的话,只要配置你的会员表即可。在配置项中增加以下配置项: //Auth配置 'auth' => array( // 用户组数据表名 //'auth_group' => 'tp_group', // 用户-用户组关系表 //'auth_group_access' => 'tp_group_access', // 权限规则表 //'auth_rule' => 'tp_rule', // 用户信息表 'auth_user' => 'think_user' ), ~~~ 7.开始测试 ~~~ $auth = new Auth(); /* 验证单个条件 验证 会员id 为 1 的 小红是否有 增加信息的权限 check方法中的参数解释: 参数1:Admin/Article/Add 假设我现在请求 Admin模块下Article控制器的Add方法 参数2: 1 为当前请求的会员ID */ $check = $auth->check('Admin/Article/Add','1'); dump($check); //返回值true,代表有此权限 //检查用户id号等于3的,是否有此权限 $check = $auth->check('Admin/Article/Add','3'); dump($check); //返回值false,没有此权限 /* 同时验证多个条件 验证 会员id 为 1 的小红是否有增加信息,修改信息 和一个不存在的规则 的权限 参数解释: 参数1:多条规则同时验证 , 验证是否拥有增加、修改、删除的权限 参数2:当前请求的会员ID */ $check = $auth->check('Admin/Article/Add,Admin/Article/CF','1'); dump($check); // ps :CF是一个不存在的规则为什么会返回真呢? 因为check方法 第5个参数默认为 or 也就是说 多个规则中只要满足一个条件即为真 $check = $auth->check('Admin/Article/Add,Admin/Article/CF','1','and'); dump($check); // false ~~~