然之createMainMenu()函数自动生成导航时不兼容权限控制问题

derek 2017-08-16 16:12:04

然之系统在前端页面整体刷新时,首先会通过createMainMenu()函数来加载导航菜单,其读取的是每个应用下的common\lang\zh-cn.php中设置的$lang->...->menu代码。但是我们看createMainMenu()函数中有如下图代码(app\sys\common\model.php 第403行)

这里的$method是通过上面说的$lang->...->menu数组设置获取的。也就是说,如果我设置的默认链接没有给权限,则这个模块其他页面给了权限,我也看不到这个模块了,因为已经跳过了。即使能看到,也是一点进来就是一个无权限页面,无法点击到我有权限的页面上去。

修复的思路是:如果默认链接没有权限访问,则获取这个模块的所有可控权限的链接,哪个有权限,哪个就替换成这个模块的默认链接。修复方法如下(在407行后添加else代码段):

整体403行后的if-else代码段如下:

                if(commonModel::hasPriv($module, $method))
                {
                    $link  = helper::createLink($module, $method, $vars);
                    $string .= !$isMobile ? "<li$class><a href='$link'>$label</a></li>\n" : "<a$class href='$link'>$label</a>";
                }
                else
                {
                    $methods = $lang->{$app->appName}->$module->menuOrder;
                    foreach ($methods as $method){
                        if(commonModel::hasPriv($module, $method))
                        {
                            $link  = helper::createLink($module, $method, $vars);
                            $string .= !$isMobile ? "<li$class><a href='$link'>$label</a></li>\n" : "<a$class href='$link'>$label</a>";
                            break;
                        }
                    }
                }


注:403行外层还有一个if-else,我们改的是else里的内容,因为if里的内容是单独控制setting等一些设置项页面的,这里可以不考虑,因为我们一般不会改变然之系统设置项的东西,如果需要,仿照上面的方式修改393到398行部分代码即可


以上代码基于然之开源版4.4

回帖列表
liugang 2017-08-16 16:42:34
 谢谢反馈!确实存在此问题,但问题一般发生于二次开发的情况下。然之系统内置了一些基本的权限,这些权限涵盖了然之的基础功能,系统提供的默认链接均属于基本权限,不建议对基本权限进行修改。
1/ 1
鲁ICP备18054969号
ZSITE8.6