假设我们有如下权限验证代码:
$auth = new \Think\Auth();
$check = $auth->check("home", 1);看上去很简单不是吗,检测id为1的用户权限中是否有名为 home 的授权。但是我们再看看数据库中规则name是什么样子的:

name明明是"home?uid=1"嘛,这是啥意思呢?
意思是,当你检测 name 授权时,必须通过post或者get传入uid=1的参数,才能通过验证。
举个栗子:
<?php
// 本类由系统自动生成,仅供测试用途
namespace Home\Controller;
use Think\Controller;
class IndexController extends Controller {
public function indexAction(){
$auth = new \Think\Auth();
$check = $auth->check("home", 1);
dump($check);
}
}这是Home模块下的Index/index方法,那么我们直接这样访问http://localhost/Home/Index/index 能通过验证吗?答案是不能。
但是通过
http://localhost/Home/Index/index?uid=1 或者
http://localhost/Home/Index/index/uid/1
就通过了。
另外3.2的auth类有两个问题:
1.用户表主键字段名必须是uid,觉得不方便的可以参考3.1的auth类中的getUserInfo()方法,覆盖3.2的方法,个人觉得3.2这种设定很蛋疼,估计是迎合ot才写死的。
2.给auth_rule表增加一个type字段吧,否则权限验证会失败,这又涉及到一个Model类的bug,很纠结,反正我是将auth类修改了,type完全不知道有什么用。
最佳答案