第6章 Drupal用户
译者:老葛
用户是使用Drupal的重要原因。Drupal可以帮助用户创建,协作,交流,并形成一个在线社区。在本章,我们将解开用户的内幕,看一下如何验证用户,用户登陆,还有用户的内部表示。我们从检查对象$user是什么以及它是如何构造的。然后我们进一步讲述了用户注册,用户登录,用户验证的流程。最后我们讲述了如何将一个现有的验证系统例如LDAP(轻量级目录访问协议)和Pubcookie等等与Drupal集成。
对象$user
用户为了登录,必须启用cookies。一个关闭了cookie的用户仍然可以以匿名的身份与Drupal交互。
在引导指令流程的会话阶段,Drupal创建了一个$object对象,用来作为当前用户的标识。如果用户没有登录(这样就没有一个会话cookie),那么它将被看作匿名用户对待。创建匿名用户的代码如下所示(位于bootstrap.inc):
function drupal_anonymous_user($session = '') {
$user = new stdClass();
$user->uid = 0;
$user->hostname = $_SERVER['REMOTE_ADDR'];
$user->roles = array();
$user->roles[DRUPAL_ANONYMOUS_RID] = 'anonymous user';
$user->session = $session;
return $user;
}
另一方面,如果用户当前登录了,通过使用用户的ID来关联表user和表session来创建对象$object。两个表中的所有字段都没放到了对象$user中。
注意:用户的ID是在用户注册时或者管理员创建用户时所分配的一个整数。最近使用ID存储在表sequences中。
通过项index.php中添加代码global $user;print_r($user);可以很容易的查看$user对象。下面是一个登录用户对象的通常结构:
stdClass Object (
[uid] => 2
[name] => Joe Example
[pass] => 7701e9e11ac326e98a3191cd386a114b
[mail] => joe@example.com
[mode] => 0
[sort] => 0
[threshold] => 0
[theme] => chameleon
[signature] => Drupal rocks!
[created] => 1161112061
[access] => 1161113476
[login] => 1161112317
[status] => 1
[timezone] => -18000
[language] => en
[picture] => files/pictures/picture-2.jpg
[init] => joe@example.com
[data] =>
[roles] => Array ( [2] => authenticated user )
[sid] => fq5vvn5ajvj4sihli314ltsqe4
[hostname] => 127.0.0.1
[timestamp] => 1161113476
[cache] => 0
[session] => user_overview_filter|a:0:{}
)
在上面展示的$object对象中,斜体字段意味着数据来自于session表。表6-1解释了$user对象的组成部分:
表6-1 $object的组成部分
组成 描述
来自于表user
uid 用户的ID.它是表users的主键并在Drupal安装中是唯一的。
Name 用户的用户名,当用户登录时输入
Pass 用户的MD5哈希化的密码,当用户登录时进行对比。由于没有保存用户的原始真实密码,所以密码只能被重置,不能被恢复。
Mail 用户当前的email地址
Mode,sort和 特定于用户的评论浏览喜好
threshold
theme 如果启用了多个主题,这个代表用户选择的主题。如果用户主题未安装,Drupal将其转到站点的默认主题。
Signature 用户进入他/她的帐户页面时所使用的签名。当用户添加一个评论时使用。仅当评论模块(comment module)启用时可见
Created 用户帐号创建时的一个Unix时间戳
Access 用户最近一次访问的Unix时间戳
Login 用户最近一次登录的Unix时间戳
Status 1表示良好,0表示被拒绝访问的用户
Timezone 用户时区与GMT之间的差异,以秒为单位
Language 用户的默认语言,通过common.inc中的local_initialize()设置
Picture 与用户帐号相联系的图像文件的路径
Init 用户注册时提供的初始email地址
Data 由模块存储的任何数据都可放置在这里(参看下一节,“向$user对象存储数据”)
来自于表user_role
roles 分配给当前用户的角色
来自于表session
sid 通过PHP分配给当前用户会话的会话ID
hostname 用户浏览当前页面时所使用的IP地址
timestamp 一个Unix时间戳,表示用户的浏览器最后一次收到一个完整页面的时间
cache 一个用于per-user caching(参看 cache.inc)的时间戳
session 在用户会话期间,模块可以向这里存储任意的数据。
向对象$user中存储数据
表users包含了一个名为data的一列用于存储保存在序列化数组中的额外信息。如果你向
对象$user中添加你自己的数据,它将会通过user_save()存储在这一列上。
// Add user's disposition.
global $user;
$extra_data = array('disposition' => t('Grumpy'));
user_save($user, $extra_data);
现在对象$user拥有了一个永久属性:
global $user;
print $user->disposition;
Grumpy
尽管这种方式很方便,但是当用户登录和初始化对象$user时,由于以这种方式存储的数据需要反序列化,这样会增加更多的开销。因此,不加考虑就向$user中放入大量的数据将会引起一个性能瓶颈。一个可选的并且是更好的在$user加载时向它添加属性方法,将会在接下来讨论。
测试用户是否登录了
测试用户是否登录的标准方式是看一下$user->uid是否为0:
global $user;
if ($user->uid) {
$output = t('User is logged in!');
else {
$output = t('User is an anonymous user.');
}
当定义一个PHP类型的区块,以向登录用户展示特定信息,向匿名用户展示其他信息时,常常使用这种方式。
<?php
global $user;
if ($user->uid) {
return t('You are currently logged in!');
}
else {
return t('You are not currently logged in.');
}
?>