CWebUser

优质
小牛编辑
125浏览
2023-12-01
所有包 | 属性 | 方法
system.web.auth
继承class CWebUser » CApplicationComponent » CComponent
实现IApplicationComponent, IWebUser
源自1.0
版本$Id: CWebUser.php 3515 2011-12-28 12:29:24Z mdomba $
源码framework/web/auth/CWebUser.php
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中。

公共属性

隐藏继承属性

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

如果设置了这个属性,当使用ajax,用户会话超时了,那么就会返回这个值。
CWebUser
loginUrlstring|array用于登录的URL。如果使用数组,第一个元素应该为登录动作的路由, 其它的是键名-键值形式的的GET参数 来组成登陆的URL(如,array('/site/login'))。如果这个属性为null, 则用一个403 HTTP 异常来代替。CWebUser
namestring返回用户唯一的标识符(如,用户名)。CWebUser
returnUrlstring返回用户成功登陆后应该跳转的URL。CWebUser
stateKeyPrefixstring存储在用户会话数据中的会话变量名称的前缀。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)
$namestring属性名字
{return}mixed属性值
源码: framework/web/auth/CWebUser.php#136 (显示) publicfunction__get($name)
{
if($this->hasState($name))
return$this->getState($name);
else
returnparent::__get($name);
}

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

__isset() 方法
public boolean __isset(string $name)
$namestring属性名字
{return}boolean
源码: framework/web/auth/CWebUser.php#164 (显示) publicfunction__isset($name)
{
if($this->hasState($name))
return$this->getState($name)!==null;
else
returnparent::__isset($name);
}

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

__set() 方法
public void __set(string $name, mixed $value)
$namestring属性名字
$valuemixed属性值
源码: framework/web/auth/CWebUser.php#150 (显示) publicfunction__set($name,$value)
{
if($this->hasState($name))
$this->setState($name,$value);
else
parent::__set($name,$value);
}

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

__unset() 方法
public void __unset(string $name)
$namestring属性名字
源码: framework/web/auth/CWebUser.php#178 (显示) publicfunction__unset($name)
{
if($this->hasState($name))
$this->setState($name,null);
else
parent::__unset($name);
}

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

afterLogin() 方法 (可用自 v1.1.3)
protected void afterLogin(boolean $fromCookie)
$fromCookieboolean是否是基于cookie登陆的。
源码: framework/web/auth/CWebUser.php#403 (显示) protectedfunctionafterLogin($fromCookie)
{
}

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

afterLogout() 方法 (可用自 v1.1.3)
protected void afterLogout()
源码: framework/web/auth/CWebUser.php#425 (显示) protectedfunctionafterLogout()
{
}

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

beforeLogin() 方法 (可用自 v1.1.3)
protected boolean beforeLogin(mixed $id, array $states, boolean $fromCookie)
$idmixed用户ID。这个和getId()方法返回的是一样的。
$statesarray用户标识(user identity)提供的键名-键值形式的数组。
$fromCookieboolean是否为基于cookie的登录
{return}boolean用户是否可以登录
源码: framework/web/auth/CWebUser.php#391 (显示) protectedfunctionbeforeLogin($id,$states,$fromCookie)
{
returntrue;
}

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

beforeLogout() 方法 (可用自 v1.1.3)
protected boolean beforeLogout()
{return}boolean是否注销用户
源码: framework/web/auth/CWebUser.php#415 (显示) protectedfunctionbeforeLogout()
{
returntrue;
}

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

changeIdentity() 方法
protected void changeIdentity(mixed $id, string $name, array $states)
$idmixed用户的唯一标识符
$namestring用户的显示的名称
$statesarray身份信息数组
源码: framework/web/auth/CWebUser.php#696 (显示) protectedfunctionchangeIdentity($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)
$operationstring需要检查的操作名称。
$paramsarray键名-键值对,将通过相关的业务规则来分配 给用户的任务和角色。
$allowCachingboolean检查用户是否有某个操作的权限。 当参数为 true时(默认),如果之前执行了访问检查操作, 其结果将直接返回之前的那个访问检查操作的结果。 如果参数为false,此方法将始终调用CAuthManager::checkAccess 来获得最新的访问的结果。请注意这个缓存只有在同样的 请求下有效。
{return}boolean此用户是否能执行某些操作。
源码: framework/web/auth/CWebUser.php#789 (显示) publicfunctioncheckAccess($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()
源码: framework/web/auth/CWebUser.php#600 (显示) publicfunctionclearStates()
{
$keys=array_keys($_SESSION);
$prefix=$this->getStateKeyPrefix();
$n=strlen($prefix);
foreach($keysas$key)
{
if(!strncmp($key,$prefix,$n))
unset($_SESSION[$key]);
}
}

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

createIdentityCookie() 方法
protected CHttpCookie createIdentityCookie(string $name)
$namestringcookie名称
{return}CHttpCookie存储身份信息的cookie
源码: framework/web/auth/CWebUser.php#511 (显示) protectedfunctioncreateIdentityCookie($name)
{
$cookie=newCHttpCookie($name,'');
if(is_array($this->identityCookie))
{
foreach($this->identityCookieas$name=>$value)
$cookie->$name=$value;
}
return$cookie;
}

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

getFlash() 方法
public mixed getFlash(string $key, mixed $defaultValue=NULL, boolean $delete=true)
$keystring提示信息的键名
$defaultValuemixed如果提示信息失效被返回的值。
$deleteboolean提示信息被访问后是否删除掉。 默认为true
{return}mixed提示信息
源码: framework/web/auth/CWebUser.php#649 (显示) publicfunctiongetFlash($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)
$deleteboolean当提示信息被该方法调用后是否要删除掉。
{return}array提示信息(key=>message)
源码: framework/web/auth/CWebUser.php#620 (显示) publicfunctiongetFlashes($delete=true)
{
$flashes=array();
$prefix=$this->getStateKeyPrefix().self::FLASH_KEY_PREFIX;
$keys=array_keys($_SESSION);
$n=strlen($prefix);
foreach($keysas$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用户的唯一标识符。如果是空,意味着用户是来宾用户。
源码: framework/web/auth/CWebUser.php#285 (显示) publicfunctiongetId()
{
return$this->getState('__id');
}
getIsGuest() 方法
public boolean getIsGuest()
{return}boolean当前应用程序用户是否是一个来宾用户。
源码: framework/web/auth/CWebUser.php#277 (显示) publicfunctiongetIsGuest()
{
return$this->getState('__id')===null;
}
getName() 方法
public string getName()
{return}string用户名称,如果用户没有登录,它将返回guestName。
源码: framework/web/auth/CWebUser.php#303 (显示) publicfunctiongetName()
{
if(($name=$this->getState('__name'))!==null)
return$name;
else
return$this->guestName;
}

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

getReturnUrl() 方法
public string getReturnUrl(string $defaultUrl=NULL)
$defaultUrlstring默认的要返回的URL,如果之前没有设置的话。如果是null, 应用入口的URL将被作为默认返回的URL。
{return}string用户登录后要返回的URL。
源码: framework/web/auth/CWebUser.php#330 (显示) publicfunctiongetReturnUrl($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)
$keystring变量名
$defaultValuemixed默认值
{return}mixed变量的值。如果在会话中不存在, 提供的默认值将被返回。
源码: framework/web/auth/CWebUser.php#555 (显示) publicfunctiongetState($key,$defaultValue=null)
{
$key=$this->getStateKeyPrefix().$key;
returnisset($_SESSION[$key])?$_SESSION[$key]:$defaultValue;
}

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

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

参见

  • setState
getStateKeyPrefix() 方法
public string getStateKeyPrefix()
{return}string存储在用户会话数据中的会话变量名称的前缀。
源码: framework/web/auth/CWebUser.php#525 (显示) publicfunctiongetStateKeyPrefix()
{
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)
$keystring提示信息的键名
{return}boolean某个指定的标识符是否存在
源码: framework/web/auth/CWebUser.php#680 (显示) publicfunctionhasFlash($key)
{
return$this->getFlash($key,null,false)!==null;
}
hasState() 方法
public boolean hasState(string $key)
$keystring状态名字
{return}boolean是否有一个指定名称的会话变量。
源码: framework/web/auth/CWebUser.php#590 (显示) publicfunctionhasState($key)
{
$key=$this->getStateKeyPrefix().$key;
returnisset($_SESSION[$key]);
}

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

init() 方法
public void init()
源码: framework/web/auth/CWebUser.php#191 (显示) publicfunctioninit()
{
parent::init();
Yii::app()->getSession()->open();
if($this->getIsGuest()&&$this->allowAutoLogin)
$this->restoreFromCookie();
elseif($this->autoRenewCookie&&$this->allowAutoLogin)
$this->renewCookie();
if($this->autoUpdateFlash)
$this->updateFlash();

$this->updateAuthStatus();
}

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

loadIdentityStates() 方法
protected void loadIdentityStates(array $states)
$statesarray身份信息数组
源码: framework/web/auth/CWebUser.php#720 (显示) protectedfunctionloadIdentityStates($states)
{
$names=array();
if(is_array($states))
{
foreach($statesas$name=>$value)
{
$this->setState($name,$value);
$names[$name]=true;
}
}
$this->setState(self::STATES_VAR,$names);
}

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

login() 方法
public boolean login(IUserIdentity $identity, integer $duration=0)
$identityIUserIdentity用户的身份信息(已经认证过的)
$durationinteger用户保持登陆状态的秒数。默认为0,意味着登陆状态持续到用户关闭浏览器。 如果大于0,将用于基于cookie登陆。在这种情况下,allowAutoLogin 必须设置为true,否则将引发异常。
{return}boolean用户是否登录。
源码: framework/web/auth/CWebUser.php#222 (显示) publicfunctionlogin($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
thrownewCException(Yii::t('yii','{class}.allowAutoLoginmustbesettrueinordertousecookie-basedauthentication.',
array('{class}'=>get_class($this))));
}

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

用户登录。

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

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

loginRequired() 方法
public void loginRequired()
源码: framework/web/auth/CWebUser.php#352 (显示) publicfunctionloginRequired()
{
$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
thrownewCHttpException(403,Yii::t('yii','LoginRequired'));
}

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

logout() 方法
public void logout(boolean $destroySession=true)
$destroySessionboolean是否注销全部的会话。默认为true。如果是false, 则clearStates会被调用,将只删除由setState设置的数据。
源码: framework/web/auth/CWebUser.php#251 (显示) publicfunctionlogout($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()
源码: framework/web/auth/CWebUser.php#467 (显示) protectedfunctionrenewCookie()
{
$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()
源码: framework/web/auth/CWebUser.php#436 (显示) protectedfunctionrestoreFromCookie()
{
$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身份信息数组
源码: framework/web/auth/CWebUser.php#708 (显示) protectedfunctionsaveIdentityStates()
{
$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)
$durationinteger用户保持登陆状态的秒数。默认为0,意味着登陆状态持续到用户关闭浏览器。
源码: framework/web/auth/CWebUser.php#491 (显示) protectedfunctionsaveToCookie($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)
$keystring提示信息的键名
$valuemixed提示信息
$defaultValuemixed如果这个值和提示信息的值相同, 提示信息将被删除。(因此,你可以使用setFlash('key',null)来删除提示信息。)
源码: framework/web/auth/CWebUser.php#665 (显示) publicfunctionsetFlash($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)
$valuemixed用户的唯一标识符。如果是空,意味着用户是一个来宾用户。
源码: framework/web/auth/CWebUser.php#293 (显示) publicfunctionsetId($value)
{
$this->setState('__id',$value);
}
setName() 方法
public void setName(string $value)
$valuestring用户名。
源码: framework/web/auth/CWebUser.php#316 (显示) publicfunctionsetName($value)
{
$this->setState('__name',$value);
}

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

参见

  • getName
setReturnUrl() 方法
public void setReturnUrl(string $value)
$valuestring用户登录后应该跳转的URL。
源码: framework/web/auth/CWebUser.php#338 (显示) publicfunctionsetReturnUrl($value)
{
$this->setState('__returnUrl',$value);
}
setState() 方法
public void setState(string $key, mixed $value, mixed $defaultValue=NULL)
$keystring变量名
$valuemixed变量值
$defaultValuemixed默认值。如果$value===$defaultValue, 变量将从会话中移除
源码: framework/web/auth/CWebUser.php#576 (显示) publicfunctionsetState($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)
$valuestring存储在用户会话数据中的会话变量名称的前缀。
源码: framework/web/auth/CWebUser.php#536 (显示) publicfunctionsetStateKeyPrefix($value)
{
$this->_keyPrefix=$value;
}
updateAuthStatus() 方法 (可用自 v1.1.7)
protected void updateAuthStatus()
源码: framework/web/auth/CWebUser.php#763 (显示) protectedfunctionupdateAuthStatus()
{
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()
源码: framework/web/auth/CWebUser.php#739 (显示) protectedfunctionupdateFlash()
{
$counters=$this->getState(self::FLASH_COUNTERS);
if(!is_array($counters))
return;
foreach($countersas$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 来保持提示信息的可用性。