490 Star 2.6K Fork 958

GVPAnyon / ThinkAdmin

 / 详情

大驼峰法命名会导致权限节点记录不正确

已完成
创建于  
2020-04-29 21:01

采用单词首字母大写的命名方法,数据库中记录节点时会将单词分开,权限验证失效了,可以随便访问。
systemauthnode

评论 (12)

Hanyi 创建了任务
Hanyi 关联仓库设置为Anyon/ThinkAdmin
展开全部操作日志

还是遵守相关开发规范,能避免一些问题。https://www.kancloud.cn/manual/thinkphp6_0/1037482

转换应该是正确的
驼峰转下划线与URL规则同步

转换应该是正确的
驼峰转下划线与URL规则同步

@Anyon 但是权限验证不正确了,驼峰类CourseMenu下面的方法本来都是需要权限才能访问的,现在可以随便访问了

使用 NodeService 可以转换下 CourseMenu => course_menu

auth 方法也有转换的

看了下代码,存储节点时将驼峰CourseMenu转下划线course_menu存储了
在验证节点时 getCurrent中获取控制器名字是Coursemenu导致没有转回下划线格式,导致与数据库中节点不匹配,权限验证失效。
输入图片说明
想问下,驼峰转成下划线存储是基于什么必要性啊,为什么不直接转小写存储呢

统一访问规则,URL 可以两方式访问,最终需要统一规则。
后台菜单节点需转为 URL(转下划线,如果转小写就转不回来了) ,权限验证也需要用到节点

url(全小写) 会导致控制器(原驼峰)访问不符合访问规则,容易出现问题

权限问题目前只是在 win 上可能会出现,现在在检查权限时增加了别名检查,由于win文件不区另大小写,甚至连 class 也不区域大小写,这里只能做一个别名处理,别名时节点去除下划线。参见 ThinkLibarary

@杨永安 @tuyazuo

/**
 * 检查指定节点授权
 * --- 需要读取缓存或扫描所有节点
 * @param string $node
 * @return boolean
 * @throws \ReflectionException
 */
public function check($node = '')
{
    if ($this->isSuper()) return true;
    $service = NodeService::instance();
    list($real, $nodes) = [$service->fullnode($node), $service->getMethods()];
    foreach ($nodes as $key => $map) if (stripos($key, '_') !== false) {
        $nodes[str_replace('_', '', $key)] = $map;
    }
    if (!empty($nodes[$real]['isauth'])) {
        return in_array($real, $this->app->session->get('user.nodes', []));
    } else {
        return !(!empty($nodes[$real]['islogin']) && !$this->isLogin());
    }
}
Anyon 任务状态待办的 修改为已完成

登录 后才可以发表评论

状态
负责人
里程碑
Pull Requests
关联的 Pull Requests 被合并后可能会关闭此 issue
分支
开始日期   -   截止日期
-
置顶选项
优先级
参与者(3)
437240 yangyongan 1578923842 126695 zoujingli 1578918740 14302 tuyazuo 1578914958
PHP
1
https://gitee.com/zoujingli/ThinkAdmin.git
git@gitee.com:zoujingli/ThinkAdmin.git
zoujingli
ThinkAdmin
ThinkAdmin

搜索帮助

14c37bed 8189591 565d56ea 8189591