> YII 类库手册 > CWebUser
system.web.auth
继承 class CWebUser » CApplicationComponent » CComponent
实现 IApplicationComponent, IWebUser
源自 1.0
版本 $Id: CWebUser.php 3515 2011-12-28 12:29:24Z mDOMba $
源码
CWebUser代表一个Web应用程序的持久状态。

CWebUser作为ID为user的一个应用程序组件。 因此,在任何地方都能通过Yii::app()->user 访问用户状态。

CWebUser应该和identity 一起使用实现了实际的验证算法。

一个典型的使用CWebUser的身份验证过程如下:
  1. 用户提供所需的信息进行身份验证。
  2. 一个是由用户提供的信息创建的身份标识实例。
  3. 调用IUserIdentity::authenticate来检查身份标识是否有效
  4. 如果有效,调用CWebUser::login登陆用户, 然后用户浏览器重定向到returnUrl。
  5. 如果无效,从身份标识中检索错误代码或错误信息 然后显示。


id和name属性都是用户的标识符。 前者主要是内部使用(如主键), 后者用于显示(如用户名)。id属性 属性在整个用户会话中是一个持久性 用户的唯一标识符。它可以是用户名,或别的东西,取决于 identity class的实现。

id和name在整个用户会员中都是持久的。 此外,一个身份标识可能有额外的通过调用 getState访问的可持久性数据。 注意,当基于cookie的验证启用时, 所有这些持久性数据将被储存在cookie中。因此, 在这些持久性数据中不要存储密码或其它敏感信息。如果需要的话你 应该直接把它们存储在服务端的session中。

公共属性

属性 类型 描述 定义在
allowAutoLogin boolean 是否开启基于cookie的登录,默认为false。 CWebUser
authTimeout integer 用户登陆后处于非活动状态的超时时间(秒)。 如果没有设置该属性,那么在当前的session到期后用户会将被注销 (对照CHttpSession::timeout)。 CWebUser
autoRenewCookie boolean 是否在每次页面请求后自动更新身份标识。 默认为false。这个属性仅当allowAutoLogin为true时起作用。 当该属性为false时,cookie从用户第一次登陆的时间起,在指定的持续时间后过期。 当该属性为true时,cookie从用户最后一次登陆的时间起, 在指定的持续时间后过期。 CWebUser
autoUpdateFlash boolean 是否自动更新提示信息的有效性。 默认为true,意味着提示信息仅在当前请求和下一次请求时有效。 如果这个设置为false,你必须确保一个提示信息在使用后删除。 (可以调用getFlash并且设置第三个参数为true来完成)。 CWebUser
behaviors array 这个应用组件附加的行为。 这此行为将在应用组件调用init时附加在应用组件上。 请参照CModel::behaviors如何指定此属性值。 CApplicationComponent
flashes array 返回所有的提示信息。 CWebUser
guestName string 来宾用户的名称,默认为“Guest”。 这个属性用于getName方法,当当前用户为来宾用户时(未认证的)。 CWebUser
id mixed 用户的唯一标识符。如果是空,意味着用户是来宾用户。 CWebUser
identityCookie array 用来初始化身份cookie的属性值(键名-键值) 一些CHttpCookie属性会被初始化。 这个属性仅当allowAutoLogin为true时有效。 CWebUser
isGuest boolean 当前应用程序用户是否是一个来宾用户。 CWebUser
isInitialized boolean 检查应用组件是否已经初始化。 CApplicationComponent
loginRequiredAjaxResponse string 当使用ajax时用户的会话超时,这种情况下输出值。 当发出请求时,用户会话已经超时,loginRequired会重定向loginUrl去登录。 如果在ajax请求下发生,会返回整个登录页面的。这个会导致 一些非常不好的用户体验,因为期望返回的是json数组,或者是预定义的字符串,因为这种情况下必须要忽略登录页面。 为了解决这个问题,可以设置这个属性为期望的返回值。

如果设置了这个属性,当使用ajax,用户会话超时了,那么就会返回这个值。
CWebUser
loginUrl string|array 用于登录的URL。如果使用数组,第一个元素应该为登录动作的路由, 其它的是键名-键值形式的的GET参数 来组成登陆的URL(如,array('/site/login'))。如果这个属性为null, 则用一个403 HTTP 异常来代替。 CWebUser
name string 返回用户唯一的标识符(如,用户名)。 CWebUser
returnUrl string 返回用户成功登陆后应该跳转的URL。 CWebUser
stateKeyPrefix string 存储在用户会话数据中的会话变量名称的前缀。 CWebUser

公共方法

方法 描述 定义在
__call() 如果类中没有调的方法名,则调用这个方法。 CComponent
__get() PHP魔术方法。 CWebUser
__isset() PHP魔术方法。 CWebUser
__set() PHP魔术方法。 CWebUser
__unset() PHP魔术方法。 CWebUser
asa() 返回这个名字的行为对象。 CComponent
attachBehavior() 附加一个行为到组件。 CComponent
attachBehaviors() 附加一个行为列表到组件。 CComponent
attachEventHandler() 为事件附加一个事件处理程序。 CComponent
canGetProperty() 确定属性是否可读。 CComponent
canSetProperty() 确定属性是否可写。 CComponent
checkAccess() 检查用户的执行权限。 CWebUser
clearStates() 从持久存储中清除所有的用户身份信息。 CWebUser
detachBehavior() 从组件中分离一个行为。 CComponent
detachBehaviors() 从组件中分离所有行为。 CComponent
detachEventHandler() 分离一个存在的事件处理程序。 CComponent
disableBehavior() 禁用一个附加行为。 CComponent
disableBehaviors() 禁用组件附加的所有行为。 CComponent
enableBehavior() 启用一个附加行为。 CComponent
enableBehaviors() 启用组件附加的所有行为。 CComponent
evaLuateExpression() 计算一个PHP表达式,或根据组件上下文执行回调。 CComponent
getEventHandlers() 返回一个事件的附加处理程序列表。 CComponent
getFlash() 返回一个提示信息。 CWebUser
getFlashes() 返回所有的提示信息。 CWebUser
getId() 返回用户的唯一标识符。如果是空,意味着用户是来宾用户。 CWebUser
getIsGuest() 检查当前应用程序用户是否是一个来宾用户。 CWebUser
getIsInitialized() 检查应用组件是否已经初始化。 CApplicationComponent
getName() 返回用户唯一的标识符(如,用户名)。 CWebUser
getReturnUrl() 返回用户成功登陆后应该跳转的URL。 CWebUser
getState() 返回用户会话中指定变量的值。 CWebUser
getStateKeyPrefix() 返回存储在用户会话数据中的会话变量名称的前缀。 CWebUser
hasEvent() 确定一个事件是否定义。 CComponent
hasEventHandler() 检查事件是否有附加的处理程序。 CComponent
hasFlash() 确定某个指定的标识符是否存在 CWebUser
hasProperty() 确定属性是否被定义。 CComponent
hasState() 返回在会话中是否有一个特定名称的会话变量。 CWebUser
init() 初始化应用组件。 CWebUser
login() 用户登录。 CWebUser
loginRequired() 重定向用户浏览器到登陆页面。 CWebUser
logout() 登出当前用户。 CWebUser
raiseEvent() 发起一个事件。 CComponent
setFlash() 存储一个提示信息。 CWebUser
setId() 设置用户的唯一标识符。如果是空,意味着用户是一个来宾用户。 CWebUser
setName() 设置用户唯一的标识符(如,用户名)。 CWebUser
setReturnUrl() 设置用户登录后应该跳转的URL。 CWebUser
setState() 在用户会话中存储一个变量。 CWebUser
setStateKeyPrefix() 设置存储在用户会话数据中的会话变量名称的前缀。 CWebUser

受保护方法

方法 描述 定义在
afterLogin() 用户成功登录后被调用的方法。 CWebUser
afterLogout() 用户登出后被调用的方法。 CWebUser
beforeLogin() 在用户登录那一时刻前被调用的方法。 CWebUser
beforeLogout() 当用户调用logout注销时,将调用该方法。 CWebUser
changeIdentity() 用指定的标识符信息来改变当前的用户。 CWebUser
createIdentityCookie() 创建一个cookie来存储标识符信息。 CWebUser
loadIdentityStates() 从一个数组加载身份信息并保存到持久的存储中 CWebUser
renewCookie() 更新存储身份的cookie。 CWebUser
restoreFromCookie() 用从cookie获取的信息填充到当前的用户对象。 CWebUser
saveIdentityStates() 从持久存储中找回信息并将它们存储到一个数组中 CWebUser
saveToCookie() 保存必要的用户的数据到一个cookie。 CWebUser
updateAuthStatus() 根据authTimeout来更新认证状态。 CWebUser
updateFlash() 更新提示信息的内部计数器。 CWebUser

属性详细

allowAutoLogin 属性
public boolean $allowAutoLogin;

是否开启基于cookie的登录,默认为false。

authTimeout 属性 (可用自 v1.1.7)
public integer $authTimeout;

用户登陆后处于非活动状态的超时时间(秒)。 如果没有设置该属性,那么在当前的session到期后用户会将被注销 (对照CHttpSession::timeout)。

autoRenewCookie 属性 (可用自 v1.1.0)
public boolean $autoRenewCookie;

是否在每次页面请求后自动更新身份标识。 默认为false。这个属性仅当allowAutoLogin为true时起作用。 当该属性为false时,cookie从用户第一次登陆的时间起,在指定的持续时间后过期。 当该属性为true时,cookie从用户最后一次登陆的时间起, 在指定的持续时间后过期。

参见

  • allowAutoLogin
autoUpdateFlash 属性 (可用自 v1.1.7)
public boolean $autoUpdateFlash;

是否自动更新提示信息的有效性。 默认为true,意味着提示信息仅在当前请求和下一次请求时有效。 如果这个设置为false,你必须确保一个提示信息在使用后删除。 (可以调用getFlash并且设置第三个参数为true来完成)。

flashes 属性 只读 (可用自 v1.1.3)
public array getFlashes(boolean $delete=true)

返回所有的提示信息。 此方法与getFlash方法类似, 不过它返回的是所有当前有效的提示信息。

guestName 属性
public string $guestName;

来宾用户的名称,默认为“Guest”。 这个属性用于getName方法,当当前用户为来宾用户时(未认证的)。

id 属性
public mixed getId()
public void setId(mixed $value)

用户的唯一标识符。如果是空,意味着用户是来宾用户。

identityCookie 属性
public array $identityCookie;

用来初始化身份cookie的属性值(键名-键值) 一些CHttpCookie属性会被初始化。 这个属性仅当allowAutoLogin为true时有效。

isGuest 属性 只读
public boolean getIsGuest()

当前应用程序用户是否是一个来宾用户。

loginRequiredAjaxResponse 属性 (可用自 v1.1.9)
public string $loginRequiredAjaxResponse;

当使用ajax时用户的会话超时,这种情况下输出值。 当发出请求时,用户会话已经超时,loginRequired会重定向loginUrl去登录。 如果在ajax请求下发生,会返回整个登录页面的。这个会导致 一些非常不好的用户体验,因为期望返回的是json数组,或者是预定义的字符串,因为这种情况下必须要忽略登录页面。 为了解决这个问题,可以设置这个属性为期望的返回值。

如果设置了这个属性,当使用ajax,用户会话超时了,那么就会返回这个值。

参见

  • loginRequired
loginUrl 属性
public string|array $loginUrl;

用于登录的URL。如果使用数组,第一个元素应该为登录动作的路由, 其它的是键名-键值形式的的GET参数 来组成登陆的URL(如,array('/site/login'))。如果这个属性为null, 则用一个403 HTTP 异常来代替。

参见

  • CController::createUrl
name 属性
public string getName()
public void setName(string $value)

返回用户唯一的标识符(如,用户名)。 这个是主要用于显示的唯一的标识符。

returnUrl 属性
public string getReturnUrl(string $defaultUrl=NULL)
public void setReturnUrl(string $value)

返回用户成功登陆后应该跳转的URL。 这个属性常用于登陆动作。如果成功登陆,将读取这个属性, 然后用它来重定向用户的浏览器。

参见

  • loginRequired
stateKeyPrefix 属性
public string getStateKeyPrefix()
public void setStateKeyPrefix(string $value)

存储在用户会话数据中的会话变量名称的前缀。

方法详细

__get() 方法
public mixed __get(string $name)
$name string 属性名字
{return} mixed 属性值
public function __get($name)
{
    if(
$this->hasState($name))
        return 
$this->getState($name);
    else
        return 
parent::__get($name);
}

PHP魔术方法。 覆盖这个方法是为了能够,可以将持续状态当作属性来访问。

__isset() 方法
public boolean __isset(string $name)
$name string 属性名字
{return} boolean
public function __isset($name)
{
    if(
$this->hasState($name))
        return 
$this->getState($name)!==null;
    else
        return 
parent::__isset($name);
}

PHP魔术方法。 覆盖这个方法是为了能够,可以将持续状态当作null来检测。

__set() 方法
public void __set(string $name, mixed $value)
$name string 属性名字
$value mixed 属性值
public function __set($name,$value)
{
    if(
$this->hasState($name))
        
$this->setState($name,$value);
    else
        
parent::__set($name,$value);
}

PHP魔术方法。 覆盖这个方法是为了能够,可以将持续状态当作属性来设置。

__unset() 方法
public void __unset(string $name)
$name string 属性名字
public function __unset($name)
{
    if(
$this->hasState($name))
        
$this->setState($name,null);
    else
        
parent::__unset($name);
}

PHP魔术方法。 覆盖这个方法是为了能够,可以将持续状态重置。

afterLogin() 方法 (可用自 v1.1.3)
protected void afterLogin(boolean $fromCookie)
$fromCookie boolean 是否是基于cookie登陆的。
protected function afterLogin($fromCookie)
{
}

用户成功登录后被调用的方法。 你可以覆盖这个方法做一些其它处理(如,记录用户的登陆ip和登陆时间, 加载用户的信息等)。

afterLogout() 方法 (可用自 v1.1.3)
protected void afterLogout()
protected function afterLogout()
{
}

用户登出后被调用的方法。 你可以重写该方法来做一些额外的清除用户信息工作。

beforeLogin() 方法 (可用自 v1.1.3)
protected boolean beforeLogin(mixed $id, array $states, boolean $fromCookie)
$id mixed 用户ID。这个和getId()方法返回的是一样的。
$states array 用户标识(user identity)提供的键名-键值形式的数组。
$fromCookie boolean 是否为基于cookie的登录
{return} boolean 用户是否可以登录
protected function beforeLogin($id,$states,$fromCookie)
{
    return 
true;
}

在用户登录那一时刻前被调用的方法。 你可以重写该方法来做一些额外的安全检查。 例如, 当基于cookie登录时, 你可能想要验证保存在用户ID对应状态的随机令牌 是否可以在 数据库中找到。这将防止黑客伪造cookie, 即使他们获取了服务器私钥。

beforeLogout() 方法 (可用自 v1.1.3)
protected boolean beforeLogout()
{return} boolean 是否注销用户
protected function beforeLogout()
{
    return 
true;
}

当用户调用logout注销时,将调用该方法。 如果该方法返回false,注销动作将被取消。 你可以重写该方法在用户注销前来 处理一些额外的工作。

changeIdentity() 方法
protected void changeIdentity(mixed $id, string $name, array $states)
$id mixed 用户的唯一标识符
$name string 用户的显示的名称
$states array 身份信息数组
protected function changeIdentity($id,$name,$states)
{
    
Yii::app()->getSession()->regenerateID();
    
$this->setId($id);
    
$this->setName($name);
    
$this->loadIdentityStates($states);
}

用指定的标识符信息来改变当前的用户。 该方法被login和restoreFromCookie 调用,在当前用户需要填充身份信息时。 派生类可以重写该方法, 来获取更多的用户相关信息。 确保首先调用父类实现。

checkAccess() 方法
public boolean checkAccess(string $operation, array $params=array ( ), boolean $allowCaching=true)
$operation string 需要检查的操作名称。
$params array 键名-键值对,将通过相关的业务规则来分配 给用户的任务和角色。
$allowCaching boolean 检查用户是否有某个操作的权限。 当参数为 true时(默认),如果之前执行了访问检查操作, 其结果将直接返回之前的那个访问检查操作的结果。 如果参数为false,此方法将始终调用CAuthManager::checkAccess 来获得最新的访问的结果。请注意这个缓存只有在同样的 请求下有效。
{return} boolean 此用户是否能执行某些操作。
public function checkAccess($operation,$params=array(),$allowCaching=true)
{
    if(
$allowCaching && $params===array() && isset($this->_access[$operation]))
        return 
$this->_access[$operation];
    else
        return 
$this->_access[$operation]=Yii::app()->getAuthManager()->checkAccess($operation,$this->getId(),$params);
}

检查用户的执行权限。

clearStates() 方法
public void clearStates()
public function clearStates()
{
    
$keys=array_keys($_SESSION);
    
$prefix=$this->getStateKeyPrefix();
    
$n=strlen($prefix);
    foreach(
$keys as $key)
    {
        if(!
strncmp($key,$prefix,$n))
            unset(
$_SESSION[$key]);
    }
}

从持久存储中清除所有的用户身份信息。 此方法将清除由setState存储的数据。

createIdentityCookie() 方法
protected CHttpCookie createIdentityCookie(string $name)
$name string cookie名称
{return} CHttpCookie 存储身份信息的cookie
protected function createIdentityCookie($name)
{
    
$cookie=new CHttpCookie($name,'');
    if(
is_array($this->identityCookie))
    {
        foreach(
$this->identityCookie as $name=>$value)
            
$cookie->$name=$value;
    }
    return 
$cookie;
}

创建一个cookie来存储标识符信息。

getFlash() 方法
public mixed getFlash(string $key, mixed $defaultValue=NULL, boolean $delete=true)
$key string 提示信息的键名
$defaultValue mixed 如果提示信息失效被返回的值。
$delete boolean 提示信息被访问后是否删除掉。 默认为true
{return} mixed 提示信息
public function getFlash($key,$defaultValue=null,$delete=true)
{
    
$value=$this->getState(self::FLASH_KEY_PREFIX.$key,$defaultValue);
    if(
$delete)
        
$this->setFlash($key,null);
    return 
$value;
}

返回一个提示信息。 一个提示信息的仅仅在当前请求和下一个请求中有效。

getFlashes() 方法 (可用自 v1.1.3)
public array getFlashes(boolean $delete=true)
$delete boolean 当提示信息被该方法调用后是否要删除掉。
{return} array 提示信息(key=>message)
public function getFlashes($delete=true)
{
    
$flashes=array();
    
$prefix=$this->getStateKeyPrefix().self::FLASH_KEY_PREFIX;
    
$keys=array_keys($_SESSION);
    
$n=strlen($prefix);
    foreach(
$keys as $key)
    {
        if(!
strncmp($key,$prefix,$n))
        {
            
$flashes[substr($key,$n)]=$_SESSION[$key];
            if(
$delete)
                unset(
$_SESSION[$key]);
        }
    }
    if(
$delete)
        
$this->setState(self::FLASH_COUNTERS,array());
    return 
$flashes;
}

返回所有的提示信息。 此方法与getFlash方法类似, 不过它返回的是所有当前有效的提示信息。

getId() 方法
public mixed getId()
{return} mixed 用户的唯一标识符。如果是空,意味着用户是来宾用户。
public function getId()
{
    return 
$this->getState('__id');
}

getIsGuest() 方法
public boolean getIsGuest()
{return} boolean 当前应用程序用户是否是一个来宾用户。
public function getIsGuest()
{
    return 
$this->getState('__id')===null;
}

getName() 方法
public string getName()
{return} string 用户名称,如果用户没有登录,它将返回guestName。
public function getName()
{
    if((
$name=$this->getState('__name'))!==null)
        return 
$name;
    else
        return 
$this->guestName;
}

返回用户唯一的标识符(如,用户名)。 这个是主要用于显示的唯一的标识符。

getReturnUrl() 方法
public string getReturnUrl(string $defaultUrl=NULL)
$defaultUrl string 默认的要返回的URL,如果之前没有设置的话。如果是null, 应用入口的URL将被作为默认返回的URL。
{return} string 用户登录后要返回的URL。
public function getReturnUrl($defaultUrl=null)
{
    return 
$this->getState('__returnUrl'$defaultUrl===null Yii::app()->getRequest()->getScriptUrl() : CHtml::normalizeUrl($defaultUrl));
}

返回用户成功登陆后应该跳转的URL。 这个属性常用于登陆动作。如果成功登陆,将读取这个属性, 然后用它来重定向用户的浏览器。

参见

  • loginRequired
getState() 方法
public mixed getState(string $key, mixed $defaultValue=NULL)
$key string 变量名
$defaultValue mixed 默认值
{return} mixed 变量的值。如果在会话中不存在, 提供的默认值将被返回。
public function getState($key,$defaultValue=null)
{
    
$key=$this->getStateKeyPrefix().$key;
    return isset(
$_SESSION[$key]) ? $_SESSION[$key] : $defaultValue;
}

返回用户会话中指定变量的值。

CWebUser子类使用此功能设计, 是希望更多的用户信息存储在用户会话中。 如果通过使用setState将变量存储在用户会话中, 可以使用此功能检索。

参见

  • setState
getStateKeyPrefix() 方法
public string getStateKeyPrefix()
{return} string 存储在用户会话数据中的会话变量名称的前缀。
public function getStateKeyPrefix()
{
    if(
$this->_keyPrefix!==null)
        return 
$this->_keyPrefix;
    else
        return 
$this->_keyPrefix=md5('Yii.'.get_class($this).'.'.Yii::app()->getId());
}

hasFlash() 方法
public boolean hasFlash(string $key)
$key string 提示信息的键名
{return} boolean 某个指定的标识符是否存在
public function hasFlash($key)
{
    return 
$this->getFlash($keynullfalse)!==null;
}

hasState() 方法
public boolean hasState(string $key)
$key string 状态名字
{return} boolean 是否有一个指定名称的会话变量。
public function hasState($key)
{
    
$key=$this->getStateKeyPrefix().$key;
    return isset(
$_SESSION[$key]);
}

返回在会话中是否有一个特定名称的会话变量。

init() 方法
public void init()
public function init()
{
    
parent::init();
    
Yii::app()->getSession()->open();
    if(
$this->getIsGuest() && $this->allowAutoLogin)
        
$this->restoreFromCookie();
    else if(
$this->autoRenewCookie && $this->allowAutoLogin)
        
$this->renewCookie();
    if(
$this->autoUpdateFlash)
        
$this->updateFlash();

    
$this->updateAuthStatus();
}

初始化应用组件。 此方法通过启动会话来重写父类的实现, 执行基于cookie的身份认证,如果启用,则更新提示变量。

loadIdentityStates() 方法
protected void loadIdentityStates(array $states)
$states array 身份信息数组
protected function loadIdentityStates($states)
{
    
$names=array();
    if(
is_array($states))
    {
        foreach(
$states as $name=>$value)
        {
            
$this->setState($name,$value);
            
$names[$name]=true;
        }
    }
    
$this->setState(self::STATES_VAR,$names);
}

从一个数组加载身份信息并保存到持久的存储中

login() 方法
public boolean login(IUserIdentity $identity, integer $duration=0)
$identity IUserIdentity 用户的身份信息(已经认证过的)
$duration integer 用户保持登陆状态的秒数。默认为0,意味着登陆状态持续到用户关闭浏览器。 如果大于0,将用于基于cookie登陆。在这种情况下,allowAutoLogin 必须设置为true,否则将引发异常。
{return} boolean 用户是否登录。
public function login($identity,$duration=0)
{
    
$id=$identity->getId();
    
$states=$identity->getPersistentStates();
    if(
$this->beforeLogin($id,$states,false))
    {
        
$this->changeIdentity($id,$identity->getName(),$states);

        if(
$duration>0)
        {
            if(
$this->allowAutoLogin)
                
$this->saveToCookie($duration);
            else
                throw new 
CException(Yii::t('yii','{class}.allowAutoLogin must be set true in order to use cookie-based authentication.',
                    array(
'{class}'=>get_class($this))));
        }

        
$this->afterLogin(false);
    }
    return !
$this->getIsGuest();
}

用户登录。

在用户会话期间,用户的身份信息将被持久的保存。 默认情况下,存储是简单的会话存储。 如果duration参数大于0, 将生成一个cookie, 为以后基于cookie登录做准备。

如果你想用户可以基于cookie登录的话, 注意, 你必须设置allowAutoLogin为true。

loginRequired() 方法
public void loginRequired()
public function loginRequired()
{
    
$app=Yii::app();
    
$request=$app->getRequest();

    if(!
$request->getIsAjaxRequest())
        
$this->setReturnUrl($request->getUrl());
    elseif(isset(
$this->loginRequiredAjaxResponse))
    {
        echo 
$this->loginRequiredAjaxResponse;
        
Yii::app()->end();
    }

    if((
$url=$this->loginUrl)!==null)
    {
        if(
is_array($url))
        {
            
$route=isset($url[0]) ? $url[0] : $app->defaultController;
            
$url=$app->createUrl($route,array_splice($url,1));
        }
        
$request->redirect($url);
    }
    else
        throw new 
CHttpException(403,Yii::t('yii','Login Required'));
}

重定向用户浏览器到登陆页面。 重定向之前,当前的URL(如果不是一个AJAX url)将被保存在 returnUrl中,以便用户的浏览器可能会被重定 向去到成功登录后的页面。确保你设置了loginUrl 使用户调用此方法后可以被重定向 到指定的登录地址调用此方法后, 将终止当前的语录处理。

logout() 方法
public void logout(boolean $destroySession=true)
$destroySession boolean 是否注销全部的会话。默认为true。如果是false, 则clearStates会被调用,将只删除由setState设置的数据。
public function logout($destroySession=true)
{
    if(
$this->beforeLogout())
    {
        if(
$this->allowAutoLogin)
        {
            
Yii::app()->getRequest()->getCookies()->remove($this->getStateKeyPrefix());
            if(
$this->identityCookie!==null)
            {
                
$cookie=$this->createIdentityCookie($this->getStateKeyPrefix());
                
$cookie->value=null;
                
$cookie->expire=0;
                
Yii::app()->getRequest()->getCookies()->add($cookie->name,$cookie);
            }
        }
        if(
$destroySession)
            
Yii::app()->getSession()->destroy();
        else
            
$this->clearStates();
        
$this->afterLogout();
    }
}

登出当前用户。 这个方法将移除相关的认证会话数据。 如果参数为true,全部的会话信息将被注销。

renewCookie() 方法 (可用自 v1.1.3)
protected void renewCookie()
protected function renewCookie()
{
    
$request=Yii::app()->getRequest();
    
$cookies=$request->getCookies();
    
$cookie=$cookies->itemAt($this->getStateKeyPrefix());
    if(
$cookie && !empty($cookie->value) && ($data=Yii::app()->getSecurityManager()->validateData($cookie->value))!==false)
    {
        
$data=@unserialize($data);
        if(
is_array($data) && isset($data[0],$data[1],$data[2],$data[3]))
        {
            
$cookie->expire=time()+$data[2];
            
$cookies->add($cookie->name,$cookie);
        }
    }
}

更新存储身份的cookie。 此方法将存储身份的cookie的过期时间设置 为当前的时间加上原先指定的cookie的持续时间。

restoreFromCookie() 方法
protected void restoreFromCookie()
protected function restoreFromCookie()
{
    
$app=Yii::app();
    
$request=$app->getRequest();
    
$cookie=$request->getCookies()->itemAt($this->getStateKeyPrefix());
    if(
$cookie && !empty($cookie->value) && ($data=$app->getSecurityManager()->validateData($cookie->value))!==false)
    {
        
$data=@unserialize($data);
        if(
is_array($data) && isset($data[0],$data[1],$data[2],$data[3]))
        {
            list(
$id,$name,$duration,$states)=$data;
            if(
$this->beforeLogin($id,$states,true))
            {
                
$this->changeIdentity($id,$name,$states);
                if(
$this->autoRenewCookie)
                {
                    
$cookie->expire=time()+$duration;
                    
$request->getCookies()->add($cookie->name,$cookie);
                }
                
$this->afterLogin(true);
            }
        }
    }
}

用从cookie获取的信息填充到当前的用户对象。 此方法用于自动登陆(allowAutoLogin)启用时。 从cookie中回收用户身份信息。 使用足够的安全措施,以防止cookie数据被篡改。

参见

  • saveToCookie
saveIdentityStates() 方法
protected array saveIdentityStates()
{return} array 身份信息数组
protected function saveIdentityStates()
{
    
$states=array();
    foreach(
$this->getState(self::STATES_VAR,array()) as $name=>$dummy)
        
$states[$name]=$this->getState($name);
    return 
$states;
}

从持久存储中找回信息并将它们存储到一个数组中

saveToCookie() 方法
protected void saveToCookie(integer $duration)
$duration integer 用户保持登陆状态的秒数。默认为0,意味着登陆状态持续到用户关闭浏览器。
protected function saveToCookie($duration)
{
    
$app=Yii::app();
    
$cookie=$this->createIdentityCookie($this->getStateKeyPrefix());
    
$cookie->expire=time()+$duration;
    
$data=array(
        
$this->getId(),
        
$this->getName(),
        
$duration,
        
$this->saveIdentityStates(),
    );
    
$cookie->value=$app->getSecurityManager()->hashData(serialize($data));
    
$app->getRequest()->getCookies()->add($cookie->name,$cookie);
}

保存必要的用户的数据到一个cookie。 此方法用于自动登陆(allowAutoLogin)启用时。 此方法保存用户ID,用户名,其它的身份信息和一个有效的key到cookie。 这些信息在用户下次访问应用时认证时使用。

参见

  • restoreFromCookie
setFlash() 方法
public void setFlash(string $key, mixed $value, mixed $defaultValue=NULL)
$key string 提示信息的键名
$value mixed 提示信息
$defaultValue mixed 如果这个值和提示信息的值相同, 提示信息将被删除。(因此,你可以使用setFlash('key',null)来删除提示信息。)
public function setFlash($key,$value,$defaultValue=null)
{
    
$this->setState(self::FLASH_KEY_PREFIX.$key,$value,$defaultValue);
    
$counters=$this->getState(self::FLASH_COUNTERS,array());
    if(
$value===$defaultValue)
        unset(
$counters[$key]);
    else
        
$counters[$key]=0;
    
$this->setState(self::FLASH_COUNTERS,$counters,array());
}

存储一个提示信息。 一个提示信息仅在当前请求和下次请求中有效。

setId() 方法
public void setId(mixed $value)
$value mixed 用户的唯一标识符。如果是空,意味着用户是一个来宾用户。
public function setId($value)
{
    
$this->setState('__id',$value);
}

setName() 方法
public void setName(string $value)
$value string 用户名。
public function setName($value)
{
    
$this->setState('__name',$value);
}

设置用户唯一的标识符(如,用户名)。

参见

  • getName
setReturnUrl() 方法
public void setReturnUrl(string $value)
$value string 用户登录后应该跳转的URL。
public function setReturnUrl($value)
{
    
$this->setState('__returnUrl',$value);
}

setState() 方法
public void setState(string $key, mixed $value, mixed $defaultValue=NULL)
$key string 变量名
$value mixed 变量值
$defaultValue mixed 默认值。如果$value===$defaultValue, 变量将从会话中移除
public function setState($key,$value,$defaultValue=null)
{
    
$key=$this->getStateKeyPrefix().$key;
    if(
$value===$defaultValue)
        unset(
$_SESSION[$key]);
    else
        
$_SESSION[$key]=$value;
}

在用户会话中存储一个变量。

CWebUser子类使用此功能设计, 是希望更多的用户信息存储在用户会话中。 通过此方法存储一个变量,变量可以用 getState取出。变量在整个用户会话期间 的页面请求中是持久的。

参见

  • getState
setStateKeyPrefix() 方法
public void setStateKeyPrefix(string $value)
$value string 存储在用户会话数据中的会话变量名称的前缀。
public function setStateKeyPrefix($value)
{
    
$this->_keyPrefix=$value;
}

updateAuthStatus() 方法 (可用自 v1.1.7)
protected void updateAuthStatus()
protected function updateAuthStatus()
{
    if(
$this->authTimeout!==null && !$this->getIsGuest())
    {
        
$expires=$this->getState(self::AUTH_TIMEOUT_VAR);
        if (
$expires!==null && $expires time())
            
$this->logout(false);
        else
            
$this->setState(self::AUTH_TIMEOUT_VAR,time()+$this->authTimeout);
    }
}

根据authTimeout来更新认证状态。 如果用户在authTimeout设置的秒数期间内不活动, 他将自动登出。

updateFlash() 方法
protected void updateFlash()
protected function updateFlash()
{
    
$counters=$this->getState(self::FLASH_COUNTERS);
    if(!
is_array($counters))
        return;
    foreach(
$counters as $key=>$count)
    {
        if(
$count)
        {
            unset(
$counters[$key]);
            
$this->setState(self::FLASH_KEY_PREFIX.$key,null);
        }
        else
            
$counters[$key]++;
    }
    
$this->setState(self::FLASH_COUNTERS,$counters,array());
}

更新提示信息的内部计数器。 此方法是内部使用的,用于CWebApplication 来保持提示信息的可用性。

上一篇: