• 数据授权(1.3.2+)
    • 按模型获取数据" level="3">按模型获取数据
    • 子节点定义" level="3">子节点定义
    • 获取用户授权节点" level="3">获取用户授权节点
    • 检查用户数据授权" level="3">检查用户数据授权

    数据授权(1.3.2+)

    本章节仅适用于1.3.2版本以上

    1.3.2版本开始,数据授权修改为分模块设置,模块内可分组。

    数据授权(1.3.2+) - 图1

    在模块信息文件info.php中,数据授权格式如下(以cms模块为例):

    1. // 授权配置
    2. 'access' => [
    3. 'column' => [
    4. 'title' => '栏目授权',
    5. 'page_tips' => '页面提示',
    6. 'tips_type' => 'primary',
    7. 'nodes' => [
    8. 'group' => 'column',
    9. 'table_name' => 'cms_column',
    10. 'primary_key' => 'id',
    11. 'parent_id' => 'pid',
    12. 'node_name' => 'name',
    13. 'model_name' => 'column',
    14. 'child' => [],
    15. ]
    16. ],
    17. ],

    其中,键值column为分组标识,建议使用英文单词。

    1. // 授权配置
    2. 'access' => [
    3. 'column' => [
    4. 'title' => '栏目授权',
    5. 'nodes' => [
    6. 'group' => 'column',
    7. 'table_name' => 'cms_column',
    8. 'primary_key' => 'id',
    9. 'parent_id' => 'pid',
    10. 'node_name' => 'name',
    11. ]
    12. ],
    13. 'type' => [
    14. 'title' => '分类授权',
    15. 'nodes' => [
    16. 'group' => 'type',
    17. 'table_name' => 'cms_type',
    18. 'primary_key' => 'id',
    19. 'parent_id' => 'pid',
    20. 'node_name' => 'name',
    21. ]
    22. ]
    23. ],

    授权页面如下:

    数据授权(1.3.2+) - 图2

    页面提示

    如果想在数据授权页面显示一些提示性文字,可配置 page_tipstips_type

    1. // 授权配置
    2. 'access' => [
    3. 'column' => [
    4. 'title' => '栏目授权',
    5. 'page_tips' => '这是页面提示',
    6. 'tips_type' => 'danger',
    7. 'nodes' => [
    8. 'group' => 'column',
    9. 'table_name' => 'cms_column',
    10. 'primary_key' => 'id',
    11. 'parent_id' => 'pid',
    12. 'node_name' => 'name',
    13. ]
    14. ]
    15. ],

    数据授权(1.3.2+) - 图3

    下面讲解最重要的配置参数nodes,所有的授权数据内容均在nodes内定义,在nodes内可定义的参数如下:

    • group 分组标识,名字自定义
    • table_name 表名,表示要关联哪张表,不需要填写表前缀
    • primary_key 主键字段名
    • parent_id 父级id字段名
    • node_name 权限节点字段名
    • model_name 模型名(可选)
    • child 子节点配置信息,格式与父节点一致

    dp_cms_column数据表有如下三个字段,分别对应primary_keyparent_idnode_name

    数据授权(1.3.2+) - 图4

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

    数据授权(1.3.2+) - 图5

    在需要判断当前用户或者某个用户是否有某些权限,可以使用Access模型的getAuthNode方法和checkAuthNode方法。

    按模型获取数据" class="reference-link">按模型获取数据

    以上说的是读取的数据在同一张表上,如果有些数据在另外一张表,那么就不好处理了。

    如果遇到这样的需求,可以设置模型名。

    1. // 授权配置
    2. 'access' => [
    3. 'column' => [
    4. 'title' => '栏目授权',
    5. 'nodes' => [
    6. 'group' => 'column',
    7. 'table_name' => 'cms_column',
    8. 'primary_key' => 'id',
    9. 'parent_id' => 'pid',
    10. 'node_name' => 'name',
    11. 'module_name' => 'column',
    12. ]
    13. ]
    14. ],

    这样配置的话,那你必须在你模块下有名为Column的模型文件,路径为:\app\模块名\model\Column.php

    除此之外,该模型下必须有一个特定的方法,方法名为access,你只需在这个方法返回你需要展示的数据即可。

    1. public function access()
    2. {
    3. return self::all();
    4. }

    也可以使用Db类进行查询数据,然后返回数据。返回的数据必须包含上面 primary_keyparent_idnode_name所定义的字段即可。

    这种方法灵活性比较大,可以随意查询数据,只要返回的数据中,有包含上面设置的三个字段名id、pid、name即可。

    子节点定义" class="reference-link">子节点定义

    如果数据节点来自不多张表,并且表之间是关联关系,那么需要定义子节点信息。

    比如某招生系统中,院系节点、专业节点、班级节点分班在不同的表,但希望数据授权的时候,能集中授权,那么这种情况下,就需要定义子节点信息。

    1. // 授权配置
    2. 'access' => [
    3. 'yx' => [
    4. 'title' => '院系专业班级',
    5. 'nodes' => [
    6. 'group' => 'yx',
    7. 'table_name' => 'admin_yxdm',
    8. 'primary_key' => 'YXDM',
    9. 'parent_id' => 'pid',
    10. 'node_name' => 'YXMC',
    11. 'model_name' => 'Yxdm',
    12. 'child' => [
    13. 'group' => 'zy',
    14. 'table_name' => 'admin_zydm',
    15. 'primary_key' => 'ZYDH',
    16. 'parent_id' => 'pid',
    17. 'node_name' => 'ZYMC',
    18. 'child' => [
    19. 'group' => 'bj',
    20. 'table_name' => 'admin_bjdm',
    21. 'primary_key' => 'BJDM',
    22. 'parent_id' => 'pid',
    23. 'node_name' => 'BJMC',
    24. ]
    25. ]
    26. ]
    27. ]
    28. ],

    在第一个nodes中,我们定义了model_nameYxdm,那么我们需要创建一个模型文件,路径为:\app\模块名\model\Yxdm.php

    在模型文件中,定义access方法

    1. public function access()
    2. {
    3. $data_list = self::all(['status' => 1]);
    4. foreach ($data_list as $key => $item) {
    5. $data_list[$key]['pid'] = 0;
    6. // 专业
    7. $child = Db::name('admin_zydm')->where('YXDM', $item['YXDM'])->select();
    8. if ($child) {
    9. foreach ($child as $k => $v) {
    10. $list_bj = Db::name('admin_bjdm')
    11. ->where('ZYDH', $v['ZYDH'])
    12. ->where('ND', config('curr_year'))
    13. ->select();
    14. if ($list_bj) {
    15. $child[$k]['child'] = $list_bj;
    16. }
    17. }
    18. $data_list[$key]['child'] = $child;
    19. }
    20. }
    21. return $data_list;
    22. }

    最终返回的$data_list格式类似这样:

    1. array(
    2. array(
    3. 'YXDM' => 1,
    4. 'pid' => 0,
    5. 'YXMC' => '机电工程学院',
    6. 'child' => [
    7. [
    8. 'ZYDH' => 12,
    9. 'pid' => 0,
    10. 'ZYMC' => '电器自动化技术',
    11. 'child' => [
    12. [
    13. 'BJDM' => 1,
    14. 'pid' => 0,
    15. 'BJMC' => '18自动化1班',
    16. ],
    17. [
    18. 'BJDM' => 2,
    19. 'pid' => 0,
    20. 'BJMC' => '18自动化2班',
    21. ]
    22. ]
    23. ],
    24. [
    25. 'ZYDH' => 13,
    26. 'pid' => 0,
    27. 'ZYMC' => '模具设计与制造',
    28. 'child' => [
    29. [
    30. 'BJDM' => 3,
    31. 'pid' => 0,
    32. 'BJMC' => '18模具1班(两年制)',
    33. ]
    34. ]
    35. ]
    36. ]
    37. ),
    38. );

    授权页面类似这样

    数据授权(1.3.2+) - 图6

    获取用户授权节点" class="reference-link">获取用户授权节点

    1. $nodes = get_auth_node(1, 'cms.column');

    表示获取用户id为1的栏目授权节点,其中column是数据授权配置中group所定义的值。

    检查用户数据授权" class="reference-link">检查用户数据授权

    1. if(check_auth_node(1, 'cms.column', 55)){
    2. //id为1的用户,拥有栏目节点id为55的访问权限
    3. } else {
    4. // id为1的用户,没有栏目节点id为55的访问权限
    5. }