| 包 | behavior | 
|---|---|
| 类层次 | Model_Behavior_AclUser » QDB_ActiveRecord_Behavior_Abstract | 
| 实现的接口 | |
| 版本 | $Id: acluser.php 2423 2009-04-21 19:59:40Z dualface $ | 
Behavior_AclUser 实现基于 ACL 的用户访问控制
acluser 行为插件支持下列设置选项:
该选项可以设置为 cleartext, md5、crypt、sha1、sha2,或任何有效的 PHP 全局函数名。其中,cleartext 表示不加密密码。
如果要使用自定义的加密方法,可以指定 encode_type 设置为一个回调函数,例如:
'encode_type' => array('MyClass', 'encryptString');
由于 acluser 插件需要通过用户名来查询对象,因此需要指定正确的属性名称。
acluser 插件在验证用户登录、更新密码时需要用到该设置指定的属性。
当启用关联角色支持后,可以通过 aclRoles() 方法来获得用户对象关联的角色信息。
关联角色支持需要设置下列选项:
默认值为 uesrname。
要指定多个属性,用“,”分割,例如“username, email”。不过不管指定什么属性,
aclData() 方法返回的数组中总是包含一个名为 id 的键,其键值是用户的 ID。
当 update_login_auto 为 true 时,可以指定下列选项:
当该设置为 true 时,将不允许创建同名用户。
并在尝试创建同名用户时抛出 AclUser_DuplicateUsernameException 异常。
| 属性 | 类型 | 描述 | 定义于 | 
|---|---|---|---|
| $_settings | array | 插件的设置信息 | Model_Behavior_AclUser | 
| $_meta | QDB_ActiveRecord_Meta | ActiveRecord 继承类的元信息对象 | QDB_ActiveRecord_Behavior_Abstract | 
| 方法 | 描述 | 定义于 | 
|---|---|---|
| bind() | 绑定行为插件 | Model_Behavior_AclUser | 
| validateLogin() | 验证用户登录并返回用户对象 | Model_Behavior_AclUser | 
| validateUsername() | 验证用户名 | Model_Behavior_AclUser | 
| validatePassword() | 验证用户名和密码 | Model_Behavior_AclUser | 
| changePassword() | 修改指定用户的密码 | Model_Behavior_AclUser | 
| checkPasswordDyn() | 检查指定的密码是否与当前用户的密码相符 | Model_Behavior_AclUser | 
| changePasswordDyn() | 修改当前用户的密码 | Model_Behavior_AclUser | 
| updateLoginDyn() | 更新用户的登录信息 | Model_Behavior_AclUser | 
| aclRolesDyn() | 获得包含用户所有角色名的数组 | Model_Behavior_AclUser | 
| aclDataDyn() | 获得用户的 ACL 数据 | Model_Behavior_AclUser | 
| _after_validate_on_create() | 在新建的 ActiveRecord 保存到数据库前调用的事件 | Model_Behavior_AclUser | 
| _after_validate_on_update() | 在更新 ActiveRecord 前调用的事件 | Model_Behavior_AclUser | 
| _save_exception_handler() | 在保存新建用户对象失败抛出异常时,还原用户的密码属性 | Model_Behavior_AclUser | 
| __construct() | 构造函数 | QDB_ActiveRecord_Behavior_Abstract | 
| normalizeConfig() | 格式化配置 | QDB_ActiveRecord_Behavior_Abstract | 
| unbind() | 撤销行为插件绑定 | QDB_ActiveRecord_Behavior_Abstract | 
| 方法 | 描述 | 定义于 | 
|---|---|---|
| _addDynamicMethod() | 为 ActiveRecord 对象添加一个动态方法 | QDB_ActiveRecord_Behavior_Abstract | 
| _addStaticMethod() | 为 ActiveRecord 类添加一个静态方法 | QDB_ActiveRecord_Behavior_Abstract | 
| _addEventHandler() | 为 ActiveRecord 对象添加一个事件处理函数 | QDB_ActiveRecord_Behavior_Abstract | 
| _setPropGetter() | 设置一个属性的 getter 方法 | QDB_ActiveRecord_Behavior_Abstract | 
| _setPropSetter() | 设置一个属性的 setter 方法 | QDB_ActiveRecord_Behavior_Abstract | 
public void bind()
绑定行为插件
public QDB_ActiveRecord_Abstract validateLogin($username, $password, $update_login)
| $username | string | 用户名 | 
| $password | string | 密码 | 
| $update_login | boolean | 阻止自动更新 | 
| {return} | QDB_ActiveRecord_Abstract | 用户对象 | 
验证用户登录并返回用户对象
如果 update_login_auto 设置为 true,验证通过时会同时更新用户的登录信息。
用法:
try { $member = Member::meta()->validateLogin($username, $password); dump($member); } catch (AclUser_Exception $ex) { echo $ex->getMessage(); }
如果用户名不存在,将抛出 AclUser_UsernameNotFoundException 异常。 密码不正确,则抛出 AclUser_WrongPasswordException 异常。
public boolean validateUsername($username)
| $username | string | 用户名 | 
| {return} | boolean | 
验证用户名
用法:
if (Member::meta()->validateUsername($username)) { echo '用户名验证通过'; }
public boolean validatePassword($username, $password)
| $username | string | 用户名 | 
| $password | string | 密码 | 
| {return} | boolean | 
验证用户名和密码
用法:
if (Member::meta()->validatePassword($username, $password)) { echo '用户名和密码验证通过'; }
public void changePassword($username, $new_password, $old_password, $ignore_old_password)
| $username | string | 用户名 | 
| $new_password | string | 新密码 | 
| $old_password | string | 旧密码 | 
| $ignore_old_password | boolean | 是否忽略对旧密码的检查,默认为 false | 
| {return} | 
修改指定用户的密码
用法:
Member::changePassword($username, $new_password, $old_password);
如果用户名不存在,则抛出 AclUser_UsernameNotFoundException 异常。 如果旧密码不正确,则抛出 AclUser_WrongPasswordException 异常。
可以通过指定 $ignore_old_password 为 true 来忽略对旧密码的检查:
Member::changePassword($username, $new_password, null, true);
public boolean checkPasswordDyn($member, $password)
| $member | QDB_ActiveRecord_Abstract | 要检查的用户对象 | 
| $password | string | 检查密码 | 
| {return} | boolean | 检查结果 | 
检查指定的密码是否与当前用户的密码相符
用法:
if ($member->checkPassword($password) { echo '指定的密码与用户现有的密码相符'; }
public void changePasswordDyn($member, $new_password, $old_password, $ignore_old_password)
| $member | QDB_ActiveRecord_Abstract | 要更新密码的用户对象 | 
| $new_password | string | 新密码 | 
| $old_password | string | 旧密码 | 
| $ignore_old_password | boolean | 是否忽略对旧密码的检查,默认为 false | 
| {return} | 
修改当前用户的密码
用法:
try { $member->changePassword($new_password, $old_password); echo '修改密码成功'; } catch (AclUser_Exception $ex) { echo $ex->getMessage(); }
如果旧密码不正确,则抛出 AclUser_WrongPasswordException 异常。
可以通过指定 $ignore_old_password 为 true 来忽略对旧密码的检查:
$member->changePassword($new_password, null, true);
public void updateLoginDyn($member, $data)
| $member | QDB_ActiveRecord_Abstract | 要更新登录信息的用户对象 | 
| $data | array | 自行指定的属性值 | 
| {return} | 
更新用户的登录信息
要更新的属性由 update_login_count_prop、update_login_at_prop 和 update_login_ip_prop 设置指定。
用法:
$member->updateLogin();
updateLogin() 会尝试自行获取登录时间和 IP 信息。如果有必要也可自行指定:
$member->updateLogin(array( 'login_at' => $time, 'login_ip' => $ip, ));
public array aclRolesDyn($member)
| $member | QDB_ActiveRecord_Abstract | 用户对象 | 
| {return} | array | 包含角色名的数组 | 
获得包含用户所有角色名的数组
用法:
$roles = $member->aclRoles(); echo '用户具有下列角色: ' . implode(', ', $roles);
public array aclDataDyn($member, $props)
| $member | QDB_ActiveRecord_Abstract | 用户对象 | 
| $props | string | 要返回的属性值 | 
| {return} | array | 包含指定属性值的数组 | 
获得用户的 ACL 数据
ACL 数据一般包含用户 ID 和用户名,通常用于配合 QACL 实现基于角色的访问控制。
用法:
$data = $member->aclData(); dump($data);
要返回的数据由 acl_data_props 设置来指定。不过不管指定了哪些属性,aclData() 的返回结果中总是为包含名为 id 的键。该键的值是用户对象的 ID。
也可以在获得 ACL 数据时通过 $props 参数指定要返回的属性值:
$data = $member->aclData('email, addr');
public void _after_validate_on_create($member)
| $member | QDB_ActiveRecord_Abstract | 用户对象 | 
| {return} | 
在新建的 ActiveRecord 保存到数据库前调用的事件
public void _after_validate_on_update($member)
| $member | QDB_ActiveRecord_Abstract | 用户对象 | 
| {return} | 
在更新 ActiveRecord 前调用的事件
public void _save_exception_handler($member, $ex)
| $member | QDB_ActiveRecord_Abstract | 保存出错的用户对象 | 
| $ex | Exception | 异常 | 
| {return} | 
在保存新建用户对象失败抛出异常时,还原用户的密码属性