采用单词首字母大写的命名方法,数据库中记录节点时会将单词分开,权限验证失效了,可以随便访问。
还是遵守相关开发规范,能避免一些问题。https://www.kancloud.cn/manual/thinkphp6_0/1037482
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。
转换应该是正确的
驼峰转下划线与URL规则同步
使用 NodeService 可以转换下 CourseMenu => course_menu
auth 方法也有转换的
看了下代码,存储节点时将驼峰CourseMenu转下划线course_menu存储了
在验证节点时 getCurrent中获取控制器名字是Coursemenu导致没有转回下划线格式,导致与数据库中节点不匹配,权限验证失效。
想问下,驼峰转成下划线存储是基于什么必要性啊,为什么不直接转小写存储呢
统一访问规则,URL 可以两方式访问,最终需要统一规则。
后台菜单节点需转为 URL(转下划线,如果转小写就转不回来了) ,权限验证也需要用到节点
url(全小写) 会导致控制器(原驼峰)访问不符合访问规则,容易出现问题
/**
* 检查指定节点授权
* --- 需要读取缓存或扫描所有节点
* @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());
}
}
登录 后才可以发表评论