如何从Moodle向外发送Session ID等用户专属参数
仅限内容编辑权限下的Moodle参数传递解决方案
方案1:使用Moodle原生支持的变量占位符(无需JS,兼容性最高)
Moodle所有支持HTML的内容编辑区域(页面模块、标签、活动描述、课程模块介绍等)默认支持内置全局变量自动替换,你直接在构造的URL里写入对应占位符即可,Moodle渲染页面时会自动替换为当前访问用户的真实值:
- 可用通用占位符列表:
{{userid}}:当前登录用户的唯一ID,可直接匹配你从数据库读取的mdl_user表id字段{{courseid}}:当前所在课程的ID,对应mdl_course表id字段{{cmid}}:当前课程模块(activity)的ID,对应mdl_course_modules表id字段{{username}}:当前用户的登录名{{sesskey}}:Moodle原生会话校验密钥,等价于你需要的会话相关标识,可直接用于请求合法性校验
- 构造URL示例:
你直接在编辑内容时插入如下链接即可,Moodle会自动替换占位符为真实值:https://你的外部系统地址/接收接口?userid={{userid}}&cmid={{cmid}}&sesskey={{sesskey}}&courseid={{courseid}} - 适用场景:只要你用的是Moodle 3.9及以上版本,该特性默认开启,无需任何后台配置,完全符合仅内容编辑的权限要求。
方案2:前端JS动态取值(适用于旧版本Moodle不支持占位符的场景)
如果你的Moodle版本过低不支持上述占位符,可直接在内容编辑区切换到HTML源码模式,插入如下JS代码动态拼接参数:
// 从Moodle全局变量直接取值 const moodleUserData = { userid: M.cfg.userid, courseid: M.cfg.courseId, sesskey: M.cfg.sesskey, cmid: M.cfg.contextinstanceid }; // 动态构造跳转链接或自动发起请求 const targetUrl = `https://你的外部系统地址/接收接口?${new URLSearchParams(moodleUserData).toString()}`; // 示例:替换页面上id为ext-link的元素的跳转地址 document.getElementById('ext-link').href = targetUrl;
配套HTML内容(同样在编辑区插入):
<a id="ext-link" href="#">点击访问外部系统</a>
- 注意事项:仅需确认站点管理员没有禁用编辑器的HTML/JS插入权限,绝大多数普通Moodle站点默认允许教师/编辑者在自己的课程内容里插入自定义HTML代码。
校验说明
你拿到外部系统接收到的参数后,可直接和你从Moodle数据库同步的数据做匹配校验:
- userid对应mdl_user.id
- cmid对应mdl_course_modules.id
- sesskey可直接匹配mdl_sessions.sesskey字段,用于校验会话有效性,避免参数伪造
内容的提问来源于stack exchange,提问作者Fred Lackey
相关产品推荐
相关产品推荐

