Drupal专业开发指南 第6章 Drupal 用户(1)

 

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.');

}

?>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值