首页 > 解决方案 > OctoberCMS BackendAuth::getUser() 返回 NULL

问题描述

问题: 尝试在OctoberCMS平台的后端(具有某些权限的管理员)中获取当前经过身份验证的用户。我通过自定义插件(在boot()方法中)扩展了插件,并且当用户无权访问它时,我想从菜单中删除 sideMenuItem 。(我成功地做到了——用户无法访问该项目(访问被拒绝)——但我想从 sideMenu 中删除该项目)。

以下代码在 MyPlugin 中,我想扩展 OtherAuthor 插件。

public function boot()
    {
        /** Extends plugin */
        $this->otherAuthorPluginExtend();
    }


 public function registerPermissions()
    {
        return [
            /** Permissions for accessing sidemenuItems from OtherAuthor plugin */
            'author.plugin.plugin_access' => [
                'roles' => ['Developer'],
            ],
        ];
    }

public function otherAuthorPluginExtend(){

//>>>THIS NOT WORK
        $user = \Backend\Facades\BackendAuth::getUser();
var_dump($user);

    /*this hide sideMenu item based on permission level*/
          if(array_key_exists('author.plugin.plugin_access', $user->permissions)) {
    //>>>THIS WORKS FINE, but for all backend users
            Event::listen('backend.menu.extendItems', function ($manager) {
                $manager->removeSideMenuItem('OtherAuthor.Plugin', 'Plugin', 'sideMenuItem');
            });
          }
    
      //>>>THIS WORKS FINE
    /*this restrict access to that page from sideMenu*/

        \OtherAuthor\Plugin\Controllers\SideMenuItemController::extend(function ($controller){
            $controller->requiredPermissions = ['author.plugin.plugin_access'];
        });
}

为什么 $user 得到 NULL?是另一种访问方式吗?

先感谢您!

标签: octobercms

解决方案


一旦所有插件注册并且用户会话开始,就会调用这个东西event,所以你需要做的是 push your conditional check code inside event callback

这样就可以获取到当前后台登录的用户。`如果您尝试将当前用户代码放在外面,则会话可能尚未初始化

您的代码应如下所示。

public function boot()
{
    /** Extends plugin */
    $this->otherAuthorPluginExtend();
}

public function otherAuthorPluginExtend(){

    // here you can not get user
    // $user = \Backend\Facades\BackendAuth::getUser();

    \Event::listen('backend.menu.extendItems', function ($manager) {
        /*this hide sideMenu item based on permission level*/
        // inside event callback you can retrieve user
        $user = \Backend\Facades\BackendAuth::getUser();
        if(array_key_exists('author.plugin.plugin_access', $user->permissions)) {
            $manager->removeSideMenuItem('OtherAuthor.Plugin', 'Plugin', 'sideMenuItem');
        }
    });

    /*this restrict access to that page from sideMenu*/
    \OtherAuthor\Plugin\Controllers\SideMenuItemController::extend(function ($controller){
        $controller->requiredPermissions = ['author.plugin.plugin_access'];
    });
}

现在一切都应该按预期工作:)

如有任何疑问,请发表评论。


推荐阅读