包 | 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} |
在保存新建用户对象失败抛出异常时,还原用户的密码属性