包 | system.web.auth |
---|---|
继承 | class CWebUser » CApplicationComponent » CComponent |
实现 | IApplicationComponent, IWebUser |
源自 | 1.0 |
版本 | $Id: CWebUser.php 3515 2011-12-28 12:29:24Z mdomba $ |
源码 |
CWebUser作为ID为user的一个应用程序组件。 因此,在任何地方都能通过
Yii::app()->user
访问用户状态。
CWebUser应该和identity 一起使用实现了实际的验证算法。
一个典型的使用CWebUser的身份验证过程如下:
- 用户提供所需的信息进行身份验证。
- 一个是由用户提供的信息创建的身份标识实例。
- 调用IUserIdentity::authenticate来检查身份标识是否有效
- 如果有效,调用CWebUser::login登陆用户, 然后用户浏览器重定向到returnUrl。
- 如果无效,从身份标识中检索错误代码或错误信息 然后显示。
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 |
属性详细
是否开启基于cookie的登录,默认为false。
用户登陆后处于非活动状态的超时时间(秒)。 如果没有设置该属性,那么在当前的session到期后用户会将被注销 (对照CHttpSession::timeout)。
是否在每次页面请求后自动更新身份标识。 默认为false。这个属性仅当allowAutoLogin为true时起作用。 当该属性为false时,cookie从用户第一次登陆的时间起,在指定的持续时间后过期。 当该属性为true时,cookie从用户最后一次登陆的时间起, 在指定的持续时间后过期。
是否自动更新提示信息的有效性。 默认为true,意味着提示信息仅在当前请求和下一次请求时有效。 如果这个设置为false,你必须确保一个提示信息在使用后删除。 (可以调用getFlash并且设置第三个参数为true来完成)。
返回所有的提示信息。 此方法与getFlash方法类似, 不过它返回的是所有当前有效的提示信息。
来宾用户的名称,默认为“Guest”。 这个属性用于getName方法,当当前用户为来宾用户时(未认证的)。
用户的唯一标识符。如果是空,意味着用户是来宾用户。
用来初始化身份cookie的属性值(键名-键值) 一些CHttpCookie属性会被初始化。 这个属性仅当allowAutoLogin为true时有效。
当前应用程序用户是否是一个来宾用户。
当使用ajax时用户的会话超时,这种情况下输出值。
当发出请求时,用户会话已经超时,loginRequired会重定向loginUrl去登录。
如果在ajax请求下发生,会返回整个登录页面的。这个会导致
一些非常不好的用户体验,因为期望返回的是json数组,或者是预定义的字符串,因为这种情况下必须要忽略登录页面。
为了解决这个问题,可以设置这个属性为期望的返回值。
如果设置了这个属性,当使用ajax,用户会话超时了,那么就会返回这个值。
用于登录的URL。如果使用数组,第一个元素应该为登录动作的路由, 其它的是键名-键值形式的的GET参数 来组成登陆的URL(如,array('/site/login'))。如果这个属性为null, 则用一个403 HTTP 异常来代替。
返回用户唯一的标识符(如,用户名)。 这个是主要用于显示的唯一的标识符。
返回用户成功登陆后应该跳转的URL。 这个属性常用于登陆动作。如果成功登陆,将读取这个属性, 然后用它来重定向用户的浏览器。
存储在用户会话数据中的会话变量名称的前缀。
方法详细
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魔术方法。 覆盖这个方法是为了能够,可以将持续状态当作属性来访问。
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来检测。
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魔术方法。 覆盖这个方法是为了能够,可以将持续状态当作属性来设置。
public void __unset(string $name)
| ||
$name | string | 属性名字 |
public function __unset($name)
{
if($this->hasState($name))
$this->setState($name,null);
else
parent::__unset($name);
}
PHP魔术方法。 覆盖这个方法是为了能够,可以将持续状态重置。
protected void afterLogin(boolean $fromCookie)
| ||
$fromCookie | boolean | 是否是基于cookie登陆的。 |
protected function afterLogin($fromCookie)
{
}
用户成功登录后被调用的方法。 你可以覆盖这个方法做一些其它处理(如,记录用户的登陆ip和登陆时间, 加载用户的信息等)。
protected void afterLogout()
|
protected function afterLogout()
{
}
用户登出后被调用的方法。 你可以重写该方法来做一些额外的清除用户信息工作。
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, 即使他们获取了服务器私钥。
protected boolean beforeLogout()
| ||
{return} | boolean | 是否注销用户 |
protected function beforeLogout()
{
return true;
}
当用户调用logout注销时,将调用该方法。 如果该方法返回false,注销动作将被取消。 你可以重写该方法在用户注销前来 处理一些额外的工作。
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 调用,在当前用户需要填充身份信息时。 派生类可以重写该方法, 来获取更多的用户相关信息。 确保首先调用父类实现。
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);
}
检查用户的执行权限。
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存储的数据。
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来存储标识符信息。
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;
}
返回一个提示信息。 一个提示信息的仅仅在当前请求和下一个请求中有效。
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方法类似, 不过它返回的是所有当前有效的提示信息。
public mixed getId()
| ||
{return} | mixed | 用户的唯一标识符。如果是空,意味着用户是来宾用户。 |
public function getId()
{
return $this->getState('__id');
}
public boolean getIsGuest()
| ||
{return} | boolean | 当前应用程序用户是否是一个来宾用户。 |
public function getIsGuest()
{
return $this->getState('__id')===null;
}
public string getName()
| ||
{return} | string | 用户名称,如果用户没有登录,它将返回guestName。 |
public function getName()
{
if(($name=$this->getState('__name'))!==null)
return $name;
else
return $this->guestName;
}
返回用户唯一的标识符(如,用户名)。 这个是主要用于显示的唯一的标识符。
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。 这个属性常用于登陆动作。如果成功登陆,将读取这个属性, 然后用它来重定向用户的浏览器。
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将变量存储在用户会话中,
可以使用此功能检索。
参见
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());
}
public boolean hasFlash(string $key)
| ||
$key | string | 提示信息的键名 |
{return} | boolean | 某个指定的标识符是否存在 |
public function hasFlash($key)
{
return $this->getFlash($key, null, false)!==null;
}
public boolean hasState(string $key)
| ||
$key | string | 状态名字 |
{return} | boolean | 是否有一个指定名称的会话变量。 |
public function hasState($key)
{
$key=$this->getStateKeyPrefix().$key;
return isset($_SESSION[$key]);
}
返回在会话中是否有一个特定名称的会话变量。
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的身份认证,如果启用,则更新提示变量。
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);
}
从一个数组加载身份信息并保存到持久的存储中
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。
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 使用户调用此方法后可以被重定向 到指定的登录地址调用此方法后, 将终止当前的语录处理。
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,全部的会话信息将被注销。
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的持续时间。
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数据被篡改。
参见
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;
}
从持久存储中找回信息并将它们存储到一个数组中
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。 这些信息在用户下次访问应用时认证时使用。
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());
}
存储一个提示信息。 一个提示信息仅在当前请求和下次请求中有效。
public void setId(mixed $value)
| ||
$value | mixed | 用户的唯一标识符。如果是空,意味着用户是一个来宾用户。 |
public function setId($value)
{
$this->setState('__id',$value);
}
public void setName(string $value)
| ||
$value | string | 用户名。 |
public function setName($value)
{
$this->setState('__name',$value);
}
设置用户唯一的标识符(如,用户名)。
参见
public void setReturnUrl(string $value)
| ||
$value | string | 用户登录后应该跳转的URL。 |
public function setReturnUrl($value)
{
$this->setState('__returnUrl',$value);
}
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取出。变量在整个用户会话期间
的页面请求中是持久的。
参见
public void setStateKeyPrefix(string $value)
| ||
$value | string | 存储在用户会话数据中的会话变量名称的前缀。 |
public function setStateKeyPrefix($value)
{
$this->_keyPrefix=$value;
}
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设置的秒数期间内不活动, 他将自动登出。
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 来保持提示信息的可用性。