You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Moodle 3.10登录方法及自定义认证插件日志添加报错咨询

Moodle 3.10 相关问题解决方案

1. Moodle 3.10 登录方法

  • 打开Moodle 3.10站点首页,找到页面顶部/侧边的「登录」入口
  • 在登录表单中输入用户名与密码
  • 点击「登录」按钮完成身份验证
  • 若启用多因素认证(MFA),按照提示完成二次验证(如验证码、令牌等)

2. 自定义认证插件auth/myapi日志事件报错解决办法

问题根源

你参照Moodle 4文档实现的自定义事件不符合Moodle 3.10的事件加载规范:3.10要求事件必须注册到插件的db/events.php,且命名空间、文件结构需严格匹配,否则系统无法识别事件类。

分步解决

步骤1:修正事件文件结构与命名空间

Moodle 3.10中,插件事件必须放在auth/myapi/classes/event/目录下,而非插件根目录。创建classes/event子目录,将事件文件移动至此,并修正命名空间:

auth/myapi/classes/event/user_loggedin.php

<?php

namespace auth\myapi\event;
defined('MOODLE_INTERNAL') || die();

class user_loggedin extends \core\event\base {
    protected function init() {
        $this->data['crud'] = 'r';
        $this->data['edulevel'] = self::LEVEL_OTHER;
        // 兼容3.10旧日志系统的配置
        $this->data['legacy'] = [
            'logentry' => "User '{$this->other['username']}' logged in via myapi auth plugin"
        ];
    }

    public static function get_name() {
        return get_string('event_userloggedin', 'auth_myapi');
    }

    public function get_description() {
        $username = $this->other['username'];
        $email = $this->other['email'];
        $firstname = $this->other['firstname'];
        $lastname = $this->other['lastname'];

        return "The user '{$username}' with email '{$email}' named '{$firstname} {$lastname}' logged in via myapi authentication plugin.";
    }

    // 3.10要求实现旧日志格式生成方法
    public function get_legacy_logdata() {
        return [
            $this->contextid,
            'auth',
            'login',
            '',
            $this->other['username']
        ];
    }
}

步骤2:创建事件注册文件

在插件db目录下创建events.php,注册自定义事件让Moodle识别:

auth/myapi/db/events.php

<?php
defined('MOODLE_INTERNAL') || die();

$observers = [];

// 注册自定义登录事件
$events = [
    [
        'eventname' => '\auth\myapi\event\user_loggedin',
        'callback' => '',
    ],
];

步骤3:修正事件触发代码

在auth/myapi/auth.php中,修正命名空间引用,且无需手动引入事件文件(Moodle自动加载机制会处理):

<?php
/**
 * External API authentication plugin
 *
 * Validates username and password against an external API, creates a new user if necessary,
 * and adds the user to a specific cohort based on the profile returned by the API.
 *
 * @package    auth_myapi
 */

defined('MOODLE_INTERNAL') || die();

// 登录成功时触发事件
$event = \auth\myapi\event\user_loggedin::create([
    'context' => \context_system::instance(),
    'other' => [
        'username' => $user->username,
        'email' => $user->email,
        'firstname' => $user->firstname,
        'lastname' => $user->lastname,
    ],
]);
$event->trigger();

步骤4:添加事件翻译字符串

在插件lang/en/auth_myapi.php文件中添加事件名称翻译(无则创建该文件):

<?php
defined('MOODLE_INTERNAL') || die();

$string['pluginname'] = 'MyAPI Authentication';
$string['event_userloggedin'] = 'User logged in via MyAPI';

步骤5:清除插件缓存

登录Moodle后台,进入「站点管理」→「开发」→「清除缓存」,确保Moodle加载新的事件定义。

登录失败日志的优化建议

若需记录登录失败行为,建议单独创建user_login_failed事件,步骤与上述一致:

  1. 创建auth/myapi/classes/event/user_login_failed.php事件类,修改描述与日志内容
  2. 在db/events.php中注册该事件
  3. 在认证失败的代码分支中触发事件:
// 认证失败时触发
$event = \auth\myapi\event\user_login_failed::create([
    'context' => \context_system::instance(),
    'other' => [
        'username' => $username, // 用户输入的用户名
    ],
]);
$event->trigger();

内容的提问来源于stack exchange,提问作者Adam

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 05:25:19