老葛的Drupal培训班 Think in Drupal
用户为了登录,必须启用cookies。一个关闭了cookie的用户仍然可以以匿名的身份与Drupal进行交互。
在引导指令流程的会话阶段,Drupal创建了一个全局$user对象,用来作为当前用户的标识。如果用户没有登录(这样就没有一个会话cookie),那么它将被当作匿名用户对待。创建匿名用户的代码如下所示(位于bootstrap.inc):
function drupal_anonymous_user($session = '') {
$user = new stdClass();
$user->uid = 0;
$user->hostname = ip_address();
$user->roles = array();
$user->roles[DRUPAL_ANONYMOUS_RID] = 'anonymous user';
$user->session = $session;
$user->cache = 0;
return $user;
}
另一方面,如果用户当前登录了,那么可以通过使用用户的ID来关联表users和sessions,以创建对象$user。两个表中的所有字段都被放到了对象$user中。
注意:用户的ID是在用户注册时或者管理员创建用户时所分配的一个整数。这个ID是users表中的主键。
通过向index.php中添加代码global $user;print_r($user);可以很容易的查看$user对象。下面是一个登录用户对象$user的通常结构:
stdClass Object (
[uid] => 2
[name] => Joe Example
[pass] => 7701e9e11ac326e98a3191cd386a114b
[mail] => joe@example.com
[mode] => 0
[sort] => 0
[threshold] => 0
[theme] => bluemarine
[signature] => Drupal rocks!
[created] => 1201383973
[access] => 1201384439
[login] => 1201383989
[status] => 1
[timezone] => -21600
[language] =>
[picture] => sites/default/files/pictures/picture-1.jpg
[init] => joe@example.com
[data] =>
[roles] => Array ( [2] => authenticated user )
[sid] => fq5vvn5ajvj4sihli314ltsqe4
[hostname] => 127.0.0.1
[timestamp] => 1201383994
[cache] => 0
[session] => user_overview_filter|a:0:{}
)
在上面显示的$user对象中,斜体字段意味着数据来自于sessions表。表6-1解释了$user对象的组成部分:
表6-1 $user的组成部分
组成 描述
来自于表users
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 用户的默认语言。只有在站点上启用了多语言,并且用户通过编辑账号喜好选择了一个语言时,才不为空。
picture 与用户账号相联系的图像文件的路径
init 用户注册时提供的初始email地址
data 由模块存储的任何数据都可放置在这里(参看下一节,“向$user对象存储数据”)
来自于表user_roles
roles 分配给当前用户的角色
来自于表session
sid 通过PHP分配给当前用户会话的会话ID
hostname 用户浏览当前页面时所使用的IP地址
timestamp 一个Unix时间戳,表示用户的浏览器最后一次接收一个完整页面的时间
cache 一个用于per-user caching(参看 includes/cache.inc)的时间戳
session 在用户会话期间,模块可以向这里存储任意的数据。