自定义SCORM交互展示模块:结果是否仅对登录用户可见?
问题解答:自定义SCORM数据区块是否仅对已登录用户可见?
结论
你的当前代码没有强制限制仅对已登录用户可见,未登录访客能否看到区块内容,取决于Moodle的页面访问权限和区块的后台配置,但这种状态存在严重的数据泄露风险。
具体分析
Moodle区块默认行为:
Moodle的block_base基类没有自带强制登录检查,区块的可见性主要由两点决定:- 区块所在页面的访客访问权限(比如首页是否允许访客访问)
- 后台区块配置中是否勾选了对"访客"角色可见
数据安全隐患:
你的代码直接从scorm_scoes_track表读取所有用户的SCORM追踪数据(包括cmi.core.lesson_status),如果未登录用户能看到这个区块,会直接获取到其他用户的学习隐私数据,违反数据安全规范。
代码改进建议
必须在get_content()方法中添加登录状态检查和权限控制,同时修复循环中内容被覆盖的问题:
class block_scormtest extends block_base { function init() { $this->title = get_string('pluginname', 'block_scormtest'); } function get_content() { global $DB, $USER, $PAGE; if ($this->content !== NULL) { return $this->content; } $this->content = new stdClass; $this->content->text = ''; // 检查用户是否已登录且不是访客 if (!isloggedin() || isguestuser()) { $this->content->text = get_string('requirelogin', 'block_scormtest'); return $this->content; } // 可选:添加更严格的权限控制(比如仅课程管理员能查看) if (!has_capability('moodle/course:manageactivities', $PAGE->context)) { $this->content->text = get_string('nopermission', 'block_scormtest'); return $this->content; } $tracks = $DB->get_records('scorm_scoes_track', ['element' => 'cmi.core.lesson_status']); $content = ''; foreach ($tracks as $track) { // 使用 .= 拼接内容,避免覆盖之前的记录 $content .= $track->attempt . ' ' . userdate($track->timemodified, get_string('strftimerecentfull')) . ' ' . $track->value . '<br>'; } $this->content->text = $content; return $this->content; } }
补充说明
- 你需要在插件的
lang/zh_cn/block_scormtest.php中添加对应的字符串定义,比如:$string['requirelogin'] = '请登录后查看SCORM数据'; $string['nopermission'] = '你没有权限查看此内容'; - 即使添加了登录检查,建议再配合Moodle后台的区块可见性设置,取消"访客"角色的访问权限,双重保障数据安全。
内容的提问来源于stack exchange,提问作者Parul S
相关产品推荐
相关产品推荐

