You are here

简单的外部认证(3)

老葛的Drupal培训班 Think in Drupal

聪明的读者将会注意到,如果同时启用了Drupal的本地认证和我们的外部认证,那么在插入操作下面,没有方式通过代码来区分用户究竟是通过本地认证的还是通过外部认证的;所以我们在这里聪明的使用了一个全局变量,来指示是我们的模块进行了认证。我们还对authmap表进行了查询,如下所示:
 
db_query("SELECT uid FROM {authmap} WHERE uid = %d AND module = '%s'", $account->uid, 'authdave');
 
    所有通过外部认证添加的用户,同时会在users表和authmap表中各有一行记录。然而,在这种情况下,由于在同一请求期间运行了认证和user钩子,所以在这里使用一个全局变量就可以很好的替代一个数据库查询了。
 
6-7. 外部用户登录/注册流程的详细

Drupal版本:

评论

 

在我们的authdave模块中(参看图6-6),我们简单的把第2个验证器替换成了我们自己的。对比图6-6和图6-4,后者显示了本地用户登录流程。
 
6-6.外部登录的执行路径,在这里,第二个验证器是由authdave模块提供的(与图6-4进行对比)
 
    函数user_external_login_register()是一个帮助函数,如果用户是初次登录的话,它会负责对用户进行注册,接着让用户登录进来。假定用户davejones初次登录,这里给出了执行路径,如图6-7所示。
 
如果用户名以“dave”开头,并且这是该用户首次登录的话, 那么在users表中就不存在该用户对应的记录,所以将会为其创建一个记录。然而,在登录过程中创建的用户没有为其提供e-mail地址,在Drupal默认的本地用户注册时则提供了e-mail地址,如果你的站点需要发送e-mail,那么这样简单的模块就不是一个可行的解决方案了。你需要设置users表的mail列,这样你就有了一个与用户相关联的e-mail地址。为了做到这一点,你可以实现user钩子,给出插入操作时的逻辑,这样当插入一个新的用户时就会调用相应的逻辑:
 
/**
 * Implementation of hook_user().
 */
function authdave_user($op, &$edit, &$account, $category = NULL) {
    switch($op) {
    case 'insert':
        // New user was just added; if we did authentication,
        // look up e-mail address of user in a legacy database.
        global $authdave_authenticated;
        if ($authdave_authenticated) {
            $email = mycompany_email_lookup($account->name);
            // Set e-mail address in the users table for this user.
            db_query("UPDATE {users} SET mail = '%s' WHERE uid = %d", $email,
                $account->uid);
            }
        break;
        ...
    }
}