##权限规则
权限规则是goAuth的核心,所有module/controller/action类型的请求都要验证。
基于”权限=url=菜单“的思想,为后端开发节约了非常多的时间和精力。
但并非每一条url都需要添加权限菜单,权限菜单可以通过正则值匹配多条url
**权限规则的6要素:**
1. 是否启用
2. 是否菜单,如果定义为菜单,则会在后台菜单中显示
3. 模块
4. 控制器
5. 行为
6. 附加参数
* * * * *
**标准匹配**
![](https://box.kancloud.cn/9d5d3722f7193c4ef9aa51541344d8f7_353x462.png)
~~~
auth/User/add
~~~
>上面这条规则会匹配到http://127.0.0.1/index.php/auth/User/add
**通配符匹配**
模块、控制器、行为的值填写 * ,表示匹配所有:
~~~
auth/User/*
~~~
>上面这条规则会匹配到auth模块下的User控制器的所有方法
http://127.0.0.1/index.php/auth/User/add
http://127.0.0.1/index.php/auth/User/edit
当然还有很多其他形式这里不一 一列出,如:
auth/*/index
*/user/edit
**限制匹配**
模块、控制器、方法的值用小逗号隔开,表示匹配多个:
~~~
auth/User/add,edit,delete
~~~
>上面这条规则会匹配3条url:
http://127.0.0.1/index.php/auth/User/add
http://127.0.0.1/index.php/auth/User/edit
http://127.0.0.1/index.php/auth/User/delete
其他写法如:
*/User,Group/add,edit,delete
auth,index/\*/add,edit,delete
当action为多个值切又勾选为菜单显示,取第一个值作为action
**菜单节点**
如果我们的权限规则勾选了菜单显示,则会自动显示在菜单栏,并且会生成一个链接,实际使用中,有些菜单不需要打开一个链接,仅仅作为一个菜单节点,用来展开子菜单,这样的节点菜单,除了菜单名字 以外的参数全部填空就行了。
![](https://box.kancloud.cn/c978e624f063f4aece08c6b0910162b7_312x363.png)
**附加参数**
权限规则分为有参规则和无参规则
附加参数与Request::instance()->param()匹配,如果有参规则被匹配中,其他同时被匹配中的无参规则将失效。
我们添加一条编辑用户的权限如下
~~~
auth/User/edit
~~~
>会匹配中下面的链接
http://127.0.0.1/index.php/auth/User/edit
http://127.0.0.1/index.php/auth/User/edit/id/5
http://127.0.0.1/index.php/auth/User/edit?id=5
只要用户被分配了 “auth/User/edit” 的权限就可以对所有用户进行编辑,如果我们需要对id=5的用户进行一些限制,需要分配了权限才能修改,我们可以添加一条规则如下:
![](https://box.kancloud.cn/04b77ea0fd9395f97f76a358eeaadf9d_312x265.png)
~~~
auth/User/edit?id=5
~~~
这时候拥有了 “auth/User/edit” 权限的用户虽然能对其他用户进行编辑,但是不能编辑id=5的用户
http://127.0.0.1/index.php/auth/User/edit/id/4 是可以正常访问的
http://127.0.0.1/index.php/auth/User/edit/id/5 则不能访问
只有拥有了 “auth/User/edit?id=5 ”权限的用户才能对id=5的用户进行编辑。
>参数可以是多个,规则同上,
其他写法说明:
?id : isset($param['id'])
?id=/[0-9]+/ : isset($param['id']) && $param['id'] 是数字
?type=post&id=/[0-9]{2}/ : $param['type'] = 'post' 且 $param['id'] 是两位数字
**实时验证**
默认情况下,每次权限验证以用户登录时的权限为准,如果想每次请求都更新用户权限,需要修改配置文件
~~~
'auth' => [
// 权限开关
'auth_on' => 1,
// 认证方式,0为登录认证;1为实时认证;n为n分钟更新权限缓存。
'auth_type' => 1,
]
~~~
>如果是大于1的数字,填写5,表示5分钟更新一次