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事件,步骤与上述一致:
- 创建
auth/myapi/classes/event/user_login_failed.php事件类,修改描述与日志内容 - 在
db/events.php中注册该事件 - 在认证失败的代码分支中触发事件:
// 认证失败时触发 $event = \auth\myapi\event\user_login_failed::create([ 'context' => \context_system::instance(), 'other' => [ 'username' => $username, // 用户输入的用户名 ], ]); $event->trigger();
内容的提问来源于stack exchange,提问作者Adam
相关产品推荐
相关产品推荐

