数据授权(1.3.2+)
本章节仅适用于1.3.2版本以上
从1.3.2版本开始,数据授权修改为分模块设置,模块内可分组。

在模块信息文件info.php中,数据授权格式如下(以cms模块为例):
// 授权配置'access' => ['column' => ['title' => '栏目授权','page_tips' => '页面提示','tips_type' => 'primary','nodes' => ['group' => 'column','table_name' => 'cms_column','primary_key' => 'id','parent_id' => 'pid','node_name' => 'name','model_name' => 'column','child' => [],]],],
其中,键值column为分组标识,建议使用英文单词。
// 授权配置'access' => ['column' => ['title' => '栏目授权','nodes' => ['group' => 'column','table_name' => 'cms_column','primary_key' => 'id','parent_id' => 'pid','node_name' => 'name',]],'type' => ['title' => '分类授权','nodes' => ['group' => 'type','table_name' => 'cms_type','primary_key' => 'id','parent_id' => 'pid','node_name' => 'name',]]],
授权页面如下:

页面提示
如果想在数据授权页面显示一些提示性文字,可配置 page_tips和 tips_type。
// 授权配置'access' => ['column' => ['title' => '栏目授权','page_tips' => '这是页面提示','tips_type' => 'danger','nodes' => ['group' => 'column','table_name' => 'cms_column','primary_key' => 'id','parent_id' => 'pid','node_name' => 'name',]]],

下面讲解最重要的配置参数nodes,所有的授权数据内容均在nodes内定义,在nodes内可定义的参数如下:
group分组标识,名字自定义table_name表名,表示要关联哪张表,不需要填写表前缀primary_key主键字段名parent_id父级id字段名node_name权限节点字段名model_name模型名(可选)child子节点配置信息,格式与父节点一致
dp_cms_column数据表有如下三个字段,分别对应primary_key、parent_id、node_name。

table_name定义表名后,系统会从该表读取授权节点,比如上面的cms模块配置

在需要判断当前用户或者某个用户是否有某些权限,可以使用Access模型的getAuthNode方法和checkAuthNode方法。
按模型获取数据" class="reference-link">按模型获取数据
以上说的是读取的数据在同一张表上,如果有些数据在另外一张表,那么就不好处理了。
如果遇到这样的需求,可以设置模型名。
// 授权配置'access' => ['column' => ['title' => '栏目授权','nodes' => ['group' => 'column','table_name' => 'cms_column','primary_key' => 'id','parent_id' => 'pid','node_name' => 'name','module_name' => 'column',]]],
这样配置的话,那你必须在你模块下有名为Column的模型文件,路径为:\app\模块名\model\Column.php
除此之外,该模型下必须有一个特定的方法,方法名为access,你只需在这个方法返回你需要展示的数据即可。
public function access(){return self::all();}
也可以使用Db类进行查询数据,然后返回数据。返回的数据必须包含上面 primary_key, parent_id , node_name所定义的字段即可。
这种方法灵活性比较大,可以随意查询数据,只要返回的数据中,有包含上面设置的三个字段名id、pid、name即可。
子节点定义" class="reference-link">子节点定义
如果数据节点来自不多张表,并且表之间是关联关系,那么需要定义子节点信息。
比如某招生系统中,院系节点、专业节点、班级节点分班在不同的表,但希望数据授权的时候,能集中授权,那么这种情况下,就需要定义子节点信息。
// 授权配置'access' => ['yx' => ['title' => '院系专业班级','nodes' => ['group' => 'yx','table_name' => 'admin_yxdm','primary_key' => 'YXDM','parent_id' => 'pid','node_name' => 'YXMC','model_name' => 'Yxdm','child' => ['group' => 'zy','table_name' => 'admin_zydm','primary_key' => 'ZYDH','parent_id' => 'pid','node_name' => 'ZYMC','child' => ['group' => 'bj','table_name' => 'admin_bjdm','primary_key' => 'BJDM','parent_id' => 'pid','node_name' => 'BJMC',]]]]],
在第一个nodes中,我们定义了model_name为Yxdm,那么我们需要创建一个模型文件,路径为:\app\模块名\model\Yxdm.php
在模型文件中,定义access方法
public function access(){$data_list = self::all(['status' => 1]);foreach ($data_list as $key => $item) {$data_list[$key]['pid'] = 0;// 专业$child = Db::name('admin_zydm')->where('YXDM', $item['YXDM'])->select();if ($child) {foreach ($child as $k => $v) {$list_bj = Db::name('admin_bjdm')->where('ZYDH', $v['ZYDH'])->where('ND', config('curr_year'))->select();if ($list_bj) {$child[$k]['child'] = $list_bj;}}$data_list[$key]['child'] = $child;}}return $data_list;}
最终返回的$data_list格式类似这样:
array(array('YXDM' => 1,'pid' => 0,'YXMC' => '机电工程学院','child' => [['ZYDH' => 12,'pid' => 0,'ZYMC' => '电器自动化技术','child' => [['BJDM' => 1,'pid' => 0,'BJMC' => '18自动化1班',],['BJDM' => 2,'pid' => 0,'BJMC' => '18自动化2班',]]],['ZYDH' => 13,'pid' => 0,'ZYMC' => '模具设计与制造','child' => [['BJDM' => 3,'pid' => 0,'BJMC' => '18模具1班(两年制)',]]]]),);
授权页面类似这样

获取用户授权节点" class="reference-link">获取用户授权节点
$nodes = get_auth_node(1, 'cms.column');
表示获取用户id为1的栏目授权节点,其中column是数据授权配置中group所定义的值。
检查用户数据授权" class="reference-link">检查用户数据授权
if(check_auth_node(1, 'cms.column', 55)){//id为1的用户,拥有栏目节点id为55的访问权限} else {// id为1的用户,没有栏目节点id为55的访问权限}
