包 core

包 mvc

包 orm

包 form

包 database

包 helper

包 cache

包 webcontrols

包 behavior

包 exception

包 debug

类 - Model_Behavior_AclUser

behavior
类层次 Model_Behavior_AclUser » QDB_ActiveRecord_Behavior_Abstract
实现的接口
版本 $Id: acluser.php 2423 2009-04-21 19:59:40Z dualface $

Behavior_AclUser 实现基于 ACL 的用户访问控制

acluser 行为插件支持下列设置选项:

  • encode_type: 密码的加密方式,默认值为 crypt。

    该选项可以设置为 cleartext, md5、crypt、sha1、sha2,或任何有效的 PHP 全局函数名。其中,cleartext 表示不加密密码。

    如果要使用自定义的加密方法,可以指定 encode_type 设置为一个回调函数,例如:

    'encode_type' => array('MyClass', 'encryptString');
  • username_prop: 指示在模型中使用哪一个属性来保存的用户名,默认值为 username。

    由于 acluser 插件需要通过用户名来查询对象,因此需要指定正确的属性名称。

  • password_prop: 指示在模型中使用哪一个属性来保存用户密码,默认值为 password。

    acluser 插件在验证用户登录、更新密码时需要用到该设置指定的属性。

  • roles_enabled: 是否启用对关联角色的支持,默认值为 false。

    当启用关联角色支持后,可以通过 aclRoles() 方法来获得用户对象关联的角色信息。

    关联角色支持需要设置下列选项:

    • roles_prop: 角色信息映射到用户模型的哪一个属性之上。默认值为 roles。
    • roles_name_prop: 指示角色模型使用哪一个属性保存角色名称,默认值为 name。
  • acl_data_props: 指示在使用 aclData() 方法时,返回的数组中要包含哪些属性。

    默认值为 uesrname。

    要指定多个属性,用“,”分割,例如“username, email”。不过不管指定什么属性,

    aclData() 方法返回的数组中总是包含一个名为 id 的键,其键值是用户的 ID。

  • update_login_auto: 是否在成功调用 validateLogin() 后自动更新用户信息,默认值为 false。

    当 update_login_auto 为 true 时,可以指定下列选项:

    • update_login_count_prop: 记录登录次数的属性,不指定则不更新;
    • update_login_at_prop: 记录登录时间的属性,不指定则不更新
    • update_login_ip_prop: 记录登录 IP 的属性,不指定则不更新
  • register_save_auto: 是否在新建用户对象时,自动保存下列信息,默认值为 false。
    • register_ip_prop: 记录用户注册时的 IP 地址
    • register_at_prop: 记录注册时间
  • unique_username: 指示是否检查用户名的唯一性,默认值为 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

属性详细说明

$_settings 属性

插件的设置信息

$_saved_state 属性

保存状态

方法详细说明

bind() 方法

public void bind()

绑定行为插件


validateLogin() 方法

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 异常。


validateUsername() 方法

public boolean validateUsername($username)

$username string 用户名
{return} boolean

验证用户名

用法:

if (Member::meta()->validateUsername($username))
{
    echo '用户名验证通过';
}

validatePassword() 方法

public boolean validatePassword($username, $password)

$username string 用户名
$password string 密码
{return} boolean

验证用户名和密码

用法:

if (Member::meta()->validatePassword($username, $password))
{
    echo '用户名和密码验证通过';
}

changePassword() 方法

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

checkPasswordDyn() 方法

public boolean checkPasswordDyn($member, $password)

$member QDB_ActiveRecord_Abstract 要检查的用户对象
$password string 检查密码
{return} boolean 检查结果

检查指定的密码是否与当前用户的密码相符

用法:

if ($member->checkPassword($password)
{
    echo '指定的密码与用户现有的密码相符';
}

changePasswordDyn() 方法

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

updateLoginDyn() 方法

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,
));

aclRolesDyn() 方法

public array aclRolesDyn($member)

$member QDB_ActiveRecord_Abstract 用户对象
{return} array 包含角色名的数组

获得包含用户所有角色名的数组

用法:

$roles = $member->aclRoles();
echo '用户具有下列角色: ' . implode(', ', $roles);

aclDataDyn() 方法

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

_after_validate_on_create() 方法

public void _after_validate_on_create($member)

$member QDB_ActiveRecord_Abstract 用户对象
{return}

在新建的 ActiveRecord 保存到数据库前调用的事件


_after_validate_on_update() 方法

public void _after_validate_on_update($member)

$member QDB_ActiveRecord_Abstract 用户对象
{return}

在更新 ActiveRecord 前调用的事件


_save_exception_handler() 方法

public void _save_exception_handler($member, $ex)

$member QDB_ActiveRecord_Abstract 保存出错的用户对象
$ex Exception 异常
{return}

在保存新建用户对象失败抛出异常时,还原用户的密码属性