Moodle用户认证切换到CAS+LDAP笔记

cms以前用的是email认证,用户自己填个人信息。过程繁琐,信息不准,相当折腾。偶然获知信息处正在做统一认证平台(CAS),就联系了一下,他们也正希望能有其它IT系统融入,所以一拍即合,相当融洽。

Moodle本身就有CAS认证插件,认证后从LDAP获取用户信息。配置起来并不复杂。两个比较好的参考:http://docs.moodle.org/en/admin/auth/ldaphttps://mediawiki.middlebury.edu/wiki/LIS/CASifying_Moodle

比较复杂的是和旧账号的兼容。如果能有明确的旧账号和CAS账号的对应关系,那么只要修改Moodle的user表,把username改成cas的用户名,auth改成cas就行。一个脚本,甚至几条sql语句就能搞定。

可惜我们没有这样的对应关系,必须让用户自己设定账号绑定,所以有了这个项目:https://github.com/hit-moodle/bind_cas_users。它先引导用户在CAS登录,然后让用户输入旧用户名和密码,验证通过,用户确认后,修改user表,使username为CAS用户名,auth为cas,这样用户以后直接从CAS登录就能完全继承旧账号的一切了。

这里有个难点,就是假如旧用户名是user1,CAS用户名是user2,而Moodle还有一个用户名是user2的用户。如果user1在user2之前做绑定,那么无法修改username。

解决方法是把所有旧用户名统一加上后缀“.local”(先要确认没有用户已经用过这个后缀),本地验证时自动在用户输入的用户名后加上“.local”。这样改username就不会发生冲突。下面这条SQL语句就是做这个的

UPDATE `mdl_user` SET `username` = concat(username,'.local') WHERE `auth` = 'email' and `deleted` = 0

提前若干天发出账号切换通知,让大家先去CAS激活账号,同时在小范围测试账号绑定程序。

在直接用cas登录时,假如moodle中并没有该用户的记录,会直接创建一个新用户。这导致,如果一个cas登录了的用户,没有去做账号绑定,直接点击了cms的任意要求登录的页面,那么他就在cms中有了一个和cas对应的新账号,而旧账号无法和新账号绑定了。这个问题的解决靠下面这个补丁:

Index: moodlelib.php
===================================================================
RCS file: /cvsroot/moodle/moodle/lib/moodlelib.php,v
retrieving revision 1.960.2.168
diff -p -r1.960.2.168 moodlelib.php
*** moodlelib.php 23 Feb 2011 20:23:52 -0000 1.960.2.168
--- moodlelib.php 8 Apr 2011 00:05:59 -0000
*************** function authenticate_user_login($userna
*** 3226,3231 ****
--- 3242,3255 ----
$user = update_user_record($username, get_auth_plugin($user->auth));
}
} else {
+ $cas_create_new = optional_param('createnewcas', 0, PARAM_BOOL);
+ if (!$cas_create_new) {
+ echo '<p>这是您第一次通过CAS认证访问乐学网。</p>';
+ echo '<p>如果您在乐学网已经有账号,务必先<a href="/bind_cas_users">绑定CAS和本站旧账号</a>,否则已有个人数据(选课、成绩、作业等)都会丢失。此操作只需一次。</p>';
+ echo '<p>如果您是乐学网的新用户,可以直接建立新账号。</p>';
+ echo '<p><a href="/bind_cas_users">我是老用户,要做绑定</a>&nbsp;&nbsp;&nbsp;&nbsp; <a href="?createnewcas=1">我是新用户,建新账号</a></p>';
+ die;
+ }
// if user not found, create him
$user = create_user_record($username, $password, $auth);
}

挑一个夜黑风高的晚上,关站完成以上过程。大家一觉醒来,就都必须都用CAS登录了。

Moodle的cas登录插件还兼容其它登录方式。在其配置中设置好后,在登录界面会显示两个选择:CAS登录、其它登录。因为cms还有很多校外用户,以及cas中还没有考虑校园访客的情况,所以我们保留了原有的email认证(用户名加了后缀)。CAS登录会先判断用户是否已经在cas中登录了。如果是,就直接以其身份登录;如果否,才显示选择登录方式的界面。

另外,auth/cas/cas_ldap_sync_users.php是需要放在cron中的脚本,但没有转换完所有账号前千万不要运行。它会直接在moodle创建ldap中的所有用户,而不会进行任何账号关联操作。一旦运行,再想让用户能继承旧数据就比较麻烦了。

Moodle用户认证切换到CAS+LDAP笔记” 中有 3 条评论

  1. 工大的信息系统,现在仍没能做到 给每人学生一个 @hit.edu.cn邮箱么(或者像曾经的@NN.hit.edu.cn),
    哪怕很小(10MB)并带有自动转发?

  2. 工大的信息系统太落后了,各个网站都是各自为政,管理混乱,而且毫无安全性可言,有的网站甚至只是一台PC运行个iis和数据库,应该把所有网站几种到网络中心的机房统一管理,这样应该能好一些吧

  3. 还有关于邮箱,关于VOD,关于BBS,校内下载站,还有很多很多,工大和其他一流学校比起来,差的不是一点半点

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注