无效用户时Modx登录preHook中断

问题描述

我正在尝试添加一个auth控件来验证用户是否已经登录,要实现这一点,我使用登录preHook,我的工作基于此https://forums.modx.com/thread/?thread=100027&page=3,这是我的最后一个prehook代码:

<?php
$modx->log(modX::LOG_LEVEL_ERROR,"Running login preHook ");
if (!isset($_GET['service'])){
    $formFields = $hook->getValues();
    $username = $formFields['username'];
    $modx->user = $modx->getObject('modUser',array('username' => $username,));
    //Agregarle validacion
    if (isset($modx->user)) {
        $modx->log(modX::LOG_LEVEL_ERROR,"Captured usernames is ".$username. ' loaded user is ' . isset($modx->user));
        $profile = $modx->user->getOne('Profile');
        if (isset($profile)) {
            $extended = $profile->get('extended');
            $modx->log(modX::LOG_LEVEL_ERROR,"Logged is ".$extended['logged'] );
            if ($extended['logged'] == '1') {
                  $url = $modx->makeURL(38,'',array('userblocked' => $username),'https');
                  $modx->log(modX::LOG_LEVEL_ERROR,"Url is ".$url );
                  $modx->sendRedirect($url);
                  return false;
            }        
        } else {
            $errorMsg = "User profile for ".$username. " not found";
            $modx->log(modX::LOG_LEVEL_ERROR,$errorMsg );
            $hook->addError('user',$errorMsg);
            return false;
        }
        
    } else {
        $errorMsg = "User ".$username. " not found";
        $modx->log(modX::LOG_LEVEL_ERROR,$errorMsg );
        $hook->addError('user',$errorMsg);
        return false;
    }
    
} else {
    return true;    
}

当我尝试使用有效的用户登录时,它可以正常工作,但是当我在登录名上键入随机乱码时,出现此错误:

致命错误:未捕获错误:在/home/magdal31/coreM0dXF1L3s/model/modx/modaccessibleobject.class.php:215中的null上调用成员函数get()堆栈跟踪:#0 / home / magdal31 / coreM0dXF1L3s /模型/modx/modaccessibleobject.class.php(36):modAccessibleObject-> checkPolicy('load')#1 /home/magdal31/coreM0dXF1L3s/xpdo/xpdo.class.php(757):modAccessibleObject :: _ loadInstance(Object(modX ),'modChunk','modChunk',数组)#2 /home/magdal31/coreM0dXF1L3s/xpdo/om/xpdoquery.class.php(584):xPDO-> call('modChunk','_loadInstance',Array)# 3 /home/magdal31/coreM0dXF1L3s/xpdo/om/xpdoquery.class.php(566):xPDOQuery->hydrateGraphParent(Array,Array)#4 /home/magdal31/coreM0dXF1L3s/xpdo/om/xpdoobject.class.php(539 ):xPDOQuery-> hydrateGraph(Object(PDOStatement),true)#5 /home/magdal31/coreM0dXF1L3s/xpdo/xpdo.class.php(757):xPDOObject :: loadCollectionGraph(Object(modX),'modChunk',Array,数组,true)#6 /home/magdal31/coreM0dXF1L3s/xpdo/xpdo.class.php(1088):xPDO-> call('modChunk','loadCollectionG ...',阵列)在第215行/home/magdal31/coreM0dXF1L3s/model/modx/modaccessibleobject.class.php中的#7 / home / magdal31 / coreM0dXF1L3s /

我的内部modx日志只说:

[2020-10-20 12:24:30](错误@ /home/magdal31/coreM0dXF1L3s/cache/includes/elements/modsnippet/114.include.cache.php:2)运行登录preHook [2020-10-20 12:24:30](错误@ /home/magdal31/coreM0dXF1L3s/cache/includes/elements/modsnippet/114.include.cache.php:29)找不到用户sdfasfa

有什么想法吗?

解决方法

我从Modx社区论坛获得了答案,并在此处添加了答案,以防万一其他人遇到相同或相似的问题,这是答案:

“您可能不应该将$ modx-> user替换为null。如果使用,请尝试使用它”

$myuser = $modx->getObject('modUser',array('username' => $username,));
//Agregarle validacion
if ($myuser) {
    $modx->user = $myuser;
    ...

代替

$modx->user = $modx->getObject('modUser',));
//Agregarle validacion
if (isset($modx->user)) {
   ....

https://community.modx.com/t/error-when-adding-prehook-to-login/3219/3?u=camicase82

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...