类 yii\web\User
继承 | yii\web\User » yii\base\Component » yii\base\BaseObject |
---|---|
实现 | yii\base\Configurable |
可用版本 | 2.0 |
源代码 | https://github.com/yiisoft/yii2/blob/master/framework/web/User.php |
User 是用于 user
应用程序组件的类,该组件管理用户的身份验证状态。
可以使用 $isGuest 来确定当前用户是否是访客。如果用户是访客,则 $identity 属性将返回 null
。否则,它将是 yii\web\IdentityInterface 的实例。
可以调用各种方法来更改用户的身份验证状态。
- login():设置指定的身份,并在会话和 Cookie 中记住身份验证状态;
- logout():将用户标记为访客,并从会话和 Cookie 中清除相关信息;
- setIdentity():更改用户身份,而不触及会话或 Cookie(这最适合在无状态 RESTful API 实现中使用)。
请注意,User 只维护用户的身份验证状态。它不会处理如何验证用户。如何验证用户的逻辑应该在实现 yii\web\IdentityInterface 的类中完成。还需要设置 $identityClass,其中包含此类的名称。
User 默认情况下在 yii\web\Application 中配置为应用程序组件。可以通过 Yii::$app->user
访问该实例。
可以通过在应用程序配置文件中添加一个数组到 components
下来修改其配置,如下面的示例所示
'user' => [
'identityClass' => 'app\models\User', // User must implement the IdentityInterface
'enableAutoLogin' => true,
// 'loginUrl' => ['user/login'],
// ...
]
公共属性
公共方法
受保护的方法
方法 | 描述 | 定义来源 |
---|---|---|
afterLogin() | 该方法在用户成功登录后调用。 | yii\web\User |
afterLogout() | 该方法在用户通过 logout() 注销后立即调用。 | yii\web\User |
beforeLogin() | 该方法在登录用户之前调用。 | yii\web\User |
beforeLogout() | 该方法在调用 logout() 注销用户时调用。 | yii\web\User |
getAccessChecker() | 返回用于检查访问权限的访问检查器。 | yii\web\User |
getAuthManager() | 返回与用户组件关联的授权管理器。 | yii\web\User |
getIdentityAndDurationFromCookie() | 确定身份 cookie 是否具有有效的格式并包含有效的授权密钥。 | yii\web\User |
loginByCookie() | 通过 cookie 登录用户。 | yii\web\User |
regenerateCsrfToken() | 重新生成 CSRF 令牌 | yii\web\User |
removeIdentityCookie() | 删除身份 cookie。 | yii\web\User |
renewAuthStatus() | 使用来自会话和 cookie 的信息更新身份验证状态。 | yii\web\User |
renewIdentityCookie() | 更新身份 cookie。 | yii\web\User |
sendIdentityCookie() | 发送身份 cookie。 | yii\web\User |
常量
常量 | 值 | 描述 | 定义来源 |
---|---|---|---|
EVENT_AFTER_LOGIN | 'afterLogin' | yii\web\User | |
EVENT_AFTER_LOGOUT | 'afterLogout' | yii\web\User | |
EVENT_BEFORE_LOGIN | 'beforeLogin' | yii\web\User | |
EVENT_BEFORE_LOGOUT | 'beforeLogout' | yii\web\User |
属性详细信息
用户将自动注销的秒数,无论活动如何。请注意,如果 $enableAutoLogin 为 true
,则此功能无效。
用于存储已认证状态的绝对过期时间戳值的会话变量名称。当 $absoluteAuthTimeout 设置时使用。
此组件应重定向到 $loginUrl 的 MIME 类型。
用于检查访问权限的访问检查器对象,或者访问检查器的应用程序组件 ID。如果未设置,将使用应用程序授权管理器。
如果用户保持不活动状态,用户将自动注销的秒数。如果未设置此属性,则用户将在当前会话过期后注销(参见 yii\web\Session::$timeout)。请注意,如果 $enableAutoLogin 为 true
,则此功能无效。
用于存储已认证状态的过期时间戳值的会话变量名称。当 $authTimeout 设置时使用。
是否在每次请求页面时自动更新身份 cookie。此属性仅在 $enableAutoLogin 为 true
时有效。当此值为 false
时,身份 cookie 将在用户最初登录后指定持续时间后过期。当此值为 true
时,身份 cookie 将在用户上次访问网站后指定持续时间后过期。
另见 $enableAutoLogin。
是否启用基于 cookie 的登录。默认为 false
。请注意,如果 $enableSession 为 false
,则此属性将被忽略。
是否使用会话来跨多个请求持久化身份验证状态。如果您的应用程序是无状态的,则将此属性设置为 false
,这在 RESTful API 中很常见。
与当前登录用户关联的身份对象。如果用户未登录(未经过身份验证),则返回 null
。
身份 cookie 的配置。此属性仅在 $enableAutoLogin 为 true
时使用。
另请参见 yii\web\Cookie。
当调用 loginRequired() 时,用于登录的 URL。如果给定一个数组,将调用 yii\web\UrlManager::createUrl() 来创建相应的 URL。数组的第一个元素应该是登录操作的路由,其余的名称-值对是用于构造登录 URL 的 GET 参数。例如,
['site/login', 'ref' => 1]
如果此属性为 null
,则在调用 loginRequired() 时将引发 403 HTTP 异常。
用户登录后应重定向到的 URL。请注意,此属性的类型在 getter 和 setter 中有所不同。有关详细信息,请参见 getReturnUrl() 和 setReturnUrl()。
方法详情
定义于: yii\base\Component::__call()
调用不是类方法的命名方法。
此方法将检查是否有任何附加的行为具有命名的方法,并在可用时执行它。
不要直接调用此方法,因为它是一个 PHP 魔术方法,当调用未知方法时会隐式调用它。
public mixed __call ( $name, $params ) | ||
$name | 字符串 |
方法名 |
$params | 数组 |
方法参数 |
返回值 | mixed |
方法返回值 |
---|---|---|
抛出 | yii\base\UnknownMethodException |
当调用未知方法时 |
public function __call($name, $params)
{
$this->ensureBehaviors();
foreach ($this->_behaviors as $object) {
if ($object->hasMethod($name)) {
return call_user_func_array([$object, $name], $params);
}
}
throw new UnknownMethodException('Calling unknown method: ' . get_class($this) . "::$name()");
}
public void __clone ( ) |
public function __clone()
{
$this->_events = [];
$this->_eventWildcards = [];
$this->_behaviors = null;
}
定义于: yii\base\BaseObject::__construct()
构造函数。
默认实现执行两件事
- 使用给定的配置
$config
初始化对象。 - 调用 init()。
如果此方法在子类中被重写,建议
- 构造函数的最后一个参数是一个配置数组,如这里的
$config
。 - 在构造函数的末尾调用父实现。
public void __construct ( $config = [] ) | ||
$config | 数组 |
用于初始化对象属性的键值对 |
public function __construct($config = [])
{
if (!empty($config)) {
Yii::configure($this, $config);
}
$this->init();
}
定义于: yii\base\Component::__get()
返回组件属性的值。
此方法将按照以下顺序进行检查并相应地执行
- 由 getter 定义的属性:返回 getter 结果
- 行为的属性:返回行为属性值
不要直接调用此方法,因为它是 PHP 魔术方法,在执行 $value = $component->property;
时会隐式调用。
另请参见 __set().
public mixed __get ( $name ) | ||
$name | 字符串 |
属性名称 |
返回值 | mixed |
属性值或行为属性的值 |
---|---|---|
抛出 | yii\base\UnknownPropertyException |
如果未定义属性 |
抛出 | yii\base\InvalidCallException |
如果属性为只写。 |
public function __get($name)
{
$getter = 'get' . $name;
if (method_exists($this, $getter)) {
// read property, e.g. getName()
return $this->$getter();
}
// behavior property
$this->ensureBehaviors();
foreach ($this->_behaviors as $behavior) {
if ($behavior->canGetProperty($name)) {
return $behavior->$name;
}
}
if (method_exists($this, 'set' . $name)) {
throw new InvalidCallException('Getting write-only property: ' . get_class($this) . '::' . $name);
}
throw new UnknownPropertyException('Getting unknown property: ' . get_class($this) . '::' . $name);
}
定义于: yii\base\Component::__isset()
检查属性是否已设置,即已定义且不为空。
此方法将按照以下顺序进行检查并相应地执行
- 由 setter 定义的属性:返回属性是否已设置
- 行为的属性:返回属性是否已设置
- 对于不存在的属性返回
false
不要直接调用此方法,因为它是 PHP 魔术方法,在执行 isset($component->property)
时会隐式调用。
public boolean __isset ( $name ) | ||
$name | 字符串 |
属性名称或事件名称 |
返回值 | 布尔值 |
命名的属性是否已设置 |
---|
public function __isset($name)
{
$getter = 'get' . $name;
if (method_exists($this, $getter)) {
return $this->$getter() !== null;
}
// behavior property
$this->ensureBehaviors();
foreach ($this->_behaviors as $behavior) {
if ($behavior->canGetProperty($name)) {
return $behavior->$name !== null;
}
}
return false;
}
定义于: yii\base\Component::__set()
设置组件属性的值。
此方法将按照以下顺序进行检查并相应地执行
- 由 setter 定义的属性:设置属性值
- 以 "on xyz" 格式的事件:将处理程序附加到事件 "xyz"
- 以 "as xyz" 格式的行为:附加名为 "xyz" 的行为
- 行为的属性:设置行为属性值
不要直接调用此方法,因为它是 PHP 魔术方法,在执行 $component->property = $value;
时会隐式调用。
另请参见 __get().
public void __set ( $name, $value ) | ||
$name | 字符串 |
属性名称或事件名称 |
$value | mixed |
属性值 |
抛出 | yii\base\UnknownPropertyException |
如果未定义属性 |
---|---|---|
抛出 | yii\base\InvalidCallException |
如果属性为只读。 |
public function __set($name, $value)
{
$setter = 'set' . $name;
if (method_exists($this, $setter)) {
// set property
$this->$setter($value);
return;
} elseif (strncmp($name, 'on ', 3) === 0) {
// on event: attach event handler
$this->on(trim(substr($name, 3)), $value);
return;
} elseif (strncmp($name, 'as ', 3) === 0) {
// as behavior: attach behavior
$name = trim(substr($name, 3));
$this->attachBehavior($name, $value instanceof Behavior ? $value : Yii::createObject($value));
return;
}
// behavior property
$this->ensureBehaviors();
foreach ($this->_behaviors as $behavior) {
if ($behavior->canSetProperty($name)) {
$behavior->$name = $value;
return;
}
}
if (method_exists($this, 'get' . $name)) {
throw new InvalidCallException('Setting read-only property: ' . get_class($this) . '::' . $name);
}
throw new UnknownPropertyException('Setting unknown property: ' . get_class($this) . '::' . $name);
}
定义于: yii\base\Component::__unset()
将组件属性设置为 null。
此方法将按照以下顺序进行检查并相应地执行
- 由 setter 定义的属性:将属性值设置为 null
- 行为的属性:将属性值设置为 null
不要直接调用此方法,因为它是 PHP 魔术方法,在执行 unset($component->property)
时会隐式调用。
public void __unset ( $name ) | ||
$name | 字符串 |
属性名称 |
抛出 | yii\base\InvalidCallException |
如果属性为只读。 |
---|
public function __unset($name)
{
$setter = 'set' . $name;
if (method_exists($this, $setter)) {
$this->$setter(null);
return;
}
// behavior property
$this->ensureBehaviors();
foreach ($this->_behaviors as $behavior) {
if ($behavior->canSetProperty($name)) {
$behavior->$name = null;
return;
}
}
throw new InvalidCallException('Unsetting an unknown or read-only property: ' . get_class($this) . '::' . $name);
}
该方法在用户成功登录后调用。
默认实现将触发 EVENT_AFTER_LOGIN 事件。如果您重写此方法,请确保调用父实现,以便触发事件。
protected void afterLogin ( $identity, $cookieBased, $duration ) | ||
$identity | yii\web\IdentityInterface |
用户身份信息 |
$cookieBased | 布尔值 |
登录是否基于 cookie |
$duration | integer |
用户可以保持登录状态的秒数。如果为 0,表示登录到用户关闭浏览器或手动销毁会话。 |
protected function afterLogin($identity, $cookieBased, $duration)
{
$this->trigger(self::EVENT_AFTER_LOGIN, new UserEvent([
'identity' => $identity,
'cookieBased' => $cookieBased,
'duration' => $duration,
]));
}
该方法在用户通过 logout() 注销后立即调用。
默认实现将触发 EVENT_AFTER_LOGOUT 事件。如果您重写此方法,请确保调用父实现,以便触发事件。
protected void afterLogout ( $identity ) | ||
$identity | yii\web\IdentityInterface |
用户身份信息 |
protected function afterLogout($identity)
{
$this->trigger(self::EVENT_AFTER_LOGOUT, new UserEvent([
'identity' => $identity,
]));
}
定义于: yii\base\Component::attachBehavior()
将行为附加到此组件。
此方法将根据给定的配置创建行为对象。之后,行为对象将通过调用 yii\base\Behavior::attach() 方法附加到此组件。
另请参见 detachBehavior().
public yii\base\Behavior attachBehavior ( $name, $behavior ) | ||
$name | 字符串 |
行为的名称。 |
$behavior | string|array|yii\base\Behavior |
行为配置。可以是以下之一
|
返回值 | yii\base\Behavior |
行为对象 |
---|
public function attachBehavior($name, $behavior)
{
$this->ensureBehaviors();
return $this->attachBehaviorInternal($name, $behavior);
}
定义于: yii\base\Component::attachBehaviors()
将行为列表附加到组件。
每个行为都按其名称索引,应为 yii\base\Behavior 对象,指定行为类的字符串,或用于创建行为的配置数组。
另请参见 attachBehavior().
public void attachBehaviors ( $behaviors ) | ||
$behaviors | 数组 |
要附加到组件的行为列表 |
public function attachBehaviors($behaviors)
{
$this->ensureBehaviors();
foreach ($behaviors as $name => $behavior) {
$this->attachBehaviorInternal($name, $behavior);
}
}
该方法在登录用户之前调用。
默认实现将触发 EVENT_BEFORE_LOGIN 事件。如果您重写此方法,请确保调用父实现,以便触发事件。
protected boolean beforeLogin ( $identity, $cookieBased, $duration ) | ||
$identity | yii\web\IdentityInterface |
用户身份信息 |
$cookieBased | 布尔值 |
登录是否基于 cookie |
$duration | integer |
用户可以保持登录状态的秒数。如果为 0,表示登录到用户关闭浏览器或手动销毁会话。 |
返回值 | 布尔值 |
用户是否应该继续登录 |
---|
protected function beforeLogin($identity, $cookieBased, $duration)
{
$event = new UserEvent([
'identity' => $identity,
'cookieBased' => $cookieBased,
'duration' => $duration,
]);
$this->trigger(self::EVENT_BEFORE_LOGIN, $event);
return $event->isValid;
}
该方法在调用 logout() 注销用户时调用。
默认实现将触发 EVENT_BEFORE_LOGOUT 事件。如果您覆盖此方法,请确保调用父级实现以触发事件。
受保护 布尔值 beforeLogout ( $identity ) | ||
$identity | yii\web\IdentityInterface |
用户身份信息 |
返回值 | 布尔值 |
用户是否应该继续注销 |
---|
protected function beforeLogout($identity)
{
$event = new UserEvent([
'identity' => $identity,
]);
$this->trigger(self::EVENT_BEFORE_LOGOUT, $event);
return $event->isValid;
}
定义于: yii\base\Component::behaviors()
返回此组件应表现出的行为列表。
子类可以覆盖此方法来指定它们想要表现的行为。
此方法的返回值应为行为对象的数组或以行为名称为索引的配置数组。行为配置可以是指定行为类的字符串,也可以是以下结构的数组
'behaviorName' => [
'class' => 'BehaviorClass',
'property1' => 'value1',
'property2' => 'value2',
]
请注意,行为类必须继承自 yii\base\Behavior。可以使用名称或匿名方式附加行为。当使用名称作为数组键时,可以使用此名称稍后使用 getBehavior() 检索行为,或者使用 detachBehavior() 卸载行为。匿名行为无法检索或卸载。
在此方法中声明的行为将自动附加到组件(按需)。
公共 数组 behaviors ( ) | ||
返回值 | 数组 |
行为配置。 |
---|
public function behaviors()
{
return [];
}
检查用户是否可以执行由给定权限指定的 operation。
请注意,您必须配置 "authManager" 应用程序组件才能使用此方法。否则它将始终返回 false。
公共 布尔值 can ( $permissionName, $params = [], $allowCaching = true ) | ||
$permissionName | 字符串 |
需要访问检查的权限的名称(例如,“编辑帖子”)。 |
$params | 数组 |
将传递给分配给用户的角色和权限相关联的规则的键值对。 |
$allowCaching | 布尔值 |
是否允许缓存访问检查的结果。当此参数为 true(默认值)时,如果之前执行过操作的访问检查,则在调用此方法检查相同操作时将直接返回其结果。如果此参数为 false,此方法将始终调用 yii\rbac\CheckAccessInterface::checkAccess() 来获取最新的访问结果。请注意,此缓存仅在同一请求内有效,并且仅在 |
返回值 | 布尔值 |
用户是否可以执行由给定权限指定的指定操作。 |
---|
public function can($permissionName, $params = [], $allowCaching = true)
{
if ($allowCaching && empty($params) && isset($this->_access[$permissionName])) {
return $this->_access[$permissionName];
}
if (($accessChecker = $this->getAccessChecker()) === null) {
return false;
}
$access = $accessChecker->checkAccess($this->getId(), $permissionName, $params);
if ($allowCaching && empty($params)) {
$this->_access[$permissionName] = $access;
}
return $access;
}
定义于: yii\base\Component::canGetProperty()
返回一个值,指示是否可以读取属性。
可以读取属性,如果
- 该类具有与指定名称关联的 getter 方法(在这种情况下,属性名称不区分大小写);
- 该类具有具有指定名称的成员变量(当
$checkVars
为 true 时); - 附加的行为具有具有给定名称的可读属性(当
$checkBehaviors
为 true 时)。
另请参阅 canSetProperty()。
公共 布尔值 canGetProperty ( $name, $checkVars = true, $checkBehaviors = true ) | ||
$name | 字符串 |
属性名称 |
$checkVars | 布尔值 |
是否将成员变量视为属性 |
$checkBehaviors | 布尔值 |
是否将行为的属性视为此组件的属性 |
返回值 | 布尔值 |
属性是否可读 |
---|
public function canGetProperty($name, $checkVars = true, $checkBehaviors = true)
{
if (method_exists($this, 'get' . $name) || $checkVars && property_exists($this, $name)) {
return true;
} elseif ($checkBehaviors) {
$this->ensureBehaviors();
foreach ($this->_behaviors as $behavior) {
if ($behavior->canGetProperty($name, $checkVars)) {
return true;
}
}
}
return false;
}
定义于: yii\base\Component::canSetProperty()
返回一个值,指示是否可以设置属性。
可以写入属性,如果
- 该类具有与指定名称关联的 setter 方法(在这种情况下,属性名称不区分大小写);
- 该类具有具有指定名称的成员变量(当
$checkVars
为 true 时); - 附加的行为具有具有给定名称的可写属性(当
$checkBehaviors
为 true 时)。
另请参阅 canGetProperty()。
公共 布尔值 canSetProperty ( $name, $checkVars = true, $checkBehaviors = true ) | ||
$name | 字符串 |
属性名称 |
$checkVars | 布尔值 |
是否将成员变量视为属性 |
$checkBehaviors | 布尔值 |
是否将行为的属性视为此组件的属性 |
返回值 | 布尔值 |
属性是否可写 |
---|
public function canSetProperty($name, $checkVars = true, $checkBehaviors = true)
{
if (method_exists($this, 'set' . $name) || $checkVars && property_exists($this, $name)) {
return true;
} elseif ($checkBehaviors) {
$this->ensureBehaviors();
foreach ($this->_behaviors as $behavior) {
if ($behavior->canSetProperty($name, $checkVars)) {
return true;
}
}
}
return false;
}
检查 Accept
头信息是否包含允许重定向到登录页面的内容类型。
默认情况下,登录页面假定为提供 text/html
或 application/xhtml+xml
。您可以通过修改 $acceptableRedirectTypes 属性来更改可接受的内容类型。
另请参阅 $acceptableRedirectTypes。
公共 布尔值 checkRedirectAcceptable ( ) | ||
返回值 | 布尔值 |
此请求是否可以重定向到登录页面。 |
---|
public function checkRedirectAcceptable()
{
$acceptableTypes = Yii::$app->getRequest()->getAcceptableContentTypes();
if (empty($acceptableTypes) || (count($acceptableTypes) === 1 && array_keys($acceptableTypes)[0] === '*/*')) {
return true;
}
foreach ($acceptableTypes as $type => $params) {
if (in_array($type, $this->acceptableRedirectTypes, true)) {
return true;
}
}
return false;
}
::class
代替。
定义于: yii\base\BaseObject::className()
返回此类的完全限定名称。
公共静态 字符串 className ( ) | ||
返回值 | 字符串 |
此类的完全限定名称。 |
---|
public static function className()
{
return get_called_class();
}
公共 yii\base\Behavior|空 detachBehavior ( $name ) | ||
$name | 字符串 |
行为的名称。 |
返回值 | yii\base\Behavior|空 |
已卸载的行为。如果行为不存在,则为空。 |
---|
public function detachBehavior($name)
{
$this->ensureBehaviors();
if (isset($this->_behaviors[$name])) {
$behavior = $this->_behaviors[$name];
unset($this->_behaviors[$name]);
$behavior->detach();
return $behavior;
}
return null;
}
定义于: yii\base\Component::detachBehaviors()
从组件中分离所有行为。
公共 空 detachBehaviors ( ) |
public function detachBehaviors()
{
$this->ensureBehaviors();
foreach ($this->_behaviors as $name => $behavior) {
$this->detachBehavior($name);
}
}
定义于: yii\base\Component::ensureBehaviors()
确保 behaviors() 中声明的行为已附加到此组件。
public void ensureBehaviors ( ) |
public function ensureBehaviors()
{
if ($this->_behaviors === null) {
$this->_behaviors = [];
foreach ($this->behaviors() as $name => $behavior) {
$this->attachBehaviorInternal($name, $behavior);
}
}
}
返回用于检查访问权限的访问检查器。
protected yii\rbac\CheckAccessInterface getAccessChecker ( ) |
protected function getAccessChecker()
{
return $this->accessChecker !== null ? $this->accessChecker : $this->getAuthManager();
}
返回与用户组件关联的授权管理器。
默认情况下,此方法返回 authManager
应用组件。您可能需要根据需要重写此方法以返回不同的授权管理器实例。
protected yii\rbac\ManagerInterface getAuthManager ( ) |
protected function getAuthManager()
{
return Yii::$app->getAuthManager();
}
定义于: yii\base\Component::getBehavior()
返回命名的行为对象。
public yii\base\Behavior|null getBehavior ( $name ) | ||
$name | 字符串 |
行为名称 |
返回值 | yii\base\Behavior|空 |
行为对象,如果行为不存在则为 null |
---|
public function getBehavior($name)
{
$this->ensureBehaviors();
return isset($this->_behaviors[$name]) ? $this->_behaviors[$name] : null;
}
定义于: yii\base\Component::getBehaviors()
返回附加到此组件的所有行为。
public yii\base\Behavior[] getBehaviors ( ) | ||
返回值 | yii\base\Behavior[] |
附加到此组件的行为列表 |
---|
public function getBehaviors()
{
$this->ensureBehaviors();
return $this->_behaviors;
}
返回唯一表示用户的值。
另请参阅 getIdentity().
public string|integer|null getId ( ) | ||
返回值 | 字符串|整数|空 |
用户的唯一标识符。如果为 |
---|
public function getId()
{
$identity = $this->getIdentity();
return $identity !== null ? $identity->getId() : null;
}
public yii\web\IdentityInterface|null getIdentity ( $autoRenew = true ) | ||
$autoRenew | 布尔值 |
是否自动更新身份验证状态,如果之前没有这样做的话。这只有在 $enableSession 为 true 时才有用。 |
返回值 | yii\web\IdentityInterface|空 |
与当前登录用户关联的身份对象。如果用户未登录(未经过身份验证),则返回 |
---|
public function getIdentity($autoRenew = true)
{
if ($this->_identity === false) {
if ($this->enableSession && $autoRenew) {
try {
$this->_identity = null;
$this->renewAuthStatus();
} catch (\Exception $e) {
$this->_identity = false;
throw $e;
} catch (\Throwable $e) {
$this->_identity = false;
throw $e;
}
} else {
return null;
}
}
return $this->_identity;
}
确定身份 cookie 是否具有有效的格式并包含有效的授权密钥。
当 $enableAutoLogin 为 true 时,此方法被使用。此方法尝试使用身份 Cookie 中的信息来验证用户。
另请参阅 loginByCookie().
protected array|null getIdentityAndDurationFromCookie ( ) | ||
返回值 | array|null |
如果有效,则返回一个包含 'identity' 和 'duration' 的数组,否则返回 null。 |
---|
protected function getIdentityAndDurationFromCookie()
{
$value = Yii::$app->getRequest()->getCookies()->getValue($this->identityCookie['name']);
if ($value === null) {
return null;
}
$data = json_decode($value, true);
if (is_array($data) && count($data) == 3) {
list($id, $authKey, $duration) = $data;
/* @var $class IdentityInterface */
$class = $this->identityClass;
$identity = $class::findIdentity($id);
if ($identity !== null) {
if (!$identity instanceof IdentityInterface) {
throw new InvalidValueException("$class::findIdentity() must return an object implementing IdentityInterface.");
} elseif (!$identity->validateAuthKey($authKey)) {
$ip = Yii::$app->getRequest()->getUserIP();
Yii::warning("Invalid cookie auth key attempted for user '$id' from $ip: $authKey", __METHOD__);
} else {
return ['identity' => $identity, 'duration' => $duration];
}
}
}
$this->removeIdentityCookie();
return null;
}
返回一个值,指示用户是否是访客(未经身份验证)。
另请参阅 getIdentity().
public boolean getIsGuest ( ) | ||
返回值 | 布尔值 |
当前用户是否是访客。 |
---|
public function getIsGuest()
{
return $this->getIdentity() === null;
}
返回浏览器在成功登录后应重定向到的 URL。
此方法从会话中读取返回 URL。它通常由登录操作调用,登录操作可能会调用此方法来将浏览器重定向到成功身份验证后的位置。
另请参阅 loginRequired().
public string getReturnUrl ( $defaultUrl = null ) | ||
$defaultUrl | 字符串|数组|空 |
如果之前未设置返回 URL,则为默认返回 URL。如果此值为 null 并且之前未设置返回 URL,则将重定向到 yii\web\Application::$homeUrl。请参考 setReturnUrl() 关于 URL 的接受格式。 |
返回值 | 字符串 |
用户登录后应重定向到的 URL。 |
---|
public function getReturnUrl($defaultUrl = null)
{
$url = Yii::$app->getSession()->get($this->returnUrlParam, $defaultUrl);
if (is_array($url)) {
if (isset($url[0])) {
return Yii::$app->getUrlManager()->createUrl($url);
}
$url = null;
}
return $url === null ? Yii::$app->getHomeUrl() : $url;
}
定义于: yii\base\Component::hasEventHandlers()
返回一个值,指示是否有任何处理程序附加到命名事件。
public boolean hasEventHandlers ( $name ) | ||
$name | 字符串 |
事件名称 |
返回值 | 布尔值 |
是否有任何处理程序附加到该事件。 |
---|
public function hasEventHandlers($name)
{
$this->ensureBehaviors();
if (!empty($this->_events[$name])) {
return true;
}
foreach ($this->_eventWildcards as $wildcard => $handlers) {
if (!empty($handlers) && StringHelper::matchWildcard($wildcard, $name)) {
return true;
}
}
return Event::hasHandlers($this, $name);
}
定义于: yii\base\Component::hasMethod()
返回一个值,指示是否定义了方法。
如果方法被定义,则
- 该类具有具有指定名称的方法
- 附加的行为具有具有给定名称的方法(当
$checkBehaviors
为 true 时)。
public boolean hasMethod ( $name, $checkBehaviors = true ) | ||
$name | 字符串 |
属性名称 |
$checkBehaviors | 布尔值 |
是否将行为的方法视为此组件的方法 |
返回值 | 布尔值 |
该方法是否已定义 |
---|
public function hasMethod($name, $checkBehaviors = true)
{
if (method_exists($this, $name)) {
return true;
} elseif ($checkBehaviors) {
$this->ensureBehaviors();
foreach ($this->_behaviors as $behavior) {
if ($behavior->hasMethod($name)) {
return true;
}
}
}
return false;
}
定义于: yii\base\Component::hasProperty()
返回一个值,指示是否为此组件定义了属性。
如果定义了一个属性,则
- 该类将具有与指定名称关联的 getter 或 setter 方法(在本例中,属性名称不区分大小写);
- 该类具有具有指定名称的成员变量(当
$checkVars
为 true 时); - 附加的行为具有给定名称的属性(当
$checkBehaviors
为 true 时)。
另请参阅
public boolean hasProperty ( $name, $checkVars = true, $checkBehaviors = true ) | ||
$name | 字符串 |
属性名称 |
$checkVars | 布尔值 |
是否将成员变量视为属性 |
$checkBehaviors | 布尔值 |
是否将行为的属性视为此组件的属性 |
返回值 | 布尔值 |
属性是否已定义 |
---|
public function hasProperty($name, $checkVars = true, $checkBehaviors = true)
{
return $this->canGetProperty($name, $checkVars, $checkBehaviors) || $this->canSetProperty($name, false, $checkBehaviors);
}
初始化应用程序组件。
public void init ( ) |
public function init()
{
parent::init();
if ($this->identityClass === null) {
throw new InvalidConfigException('User::identityClass must be set.');
}
if ($this->enableAutoLogin && !isset($this->identityCookie['name'])) {
throw new InvalidConfigException('User::identityCookie must contain the "name" element.');
}
if ($this->accessChecker !== null) {
$this->accessChecker = Instance::ensure($this->accessChecker, '\yii\rbac\CheckAccessInterface');
}
}
登录用户。
登录用户后
- 可以通过 $identity 属性获取用户的身份信息
如果 $enableSession 为 true
- 身份信息将存储在会话中,并在下一次请求中可用
- 如果
$duration == 0
:只要会话处于活动状态或用户关闭浏览器 - 如果
$duration > 0
:只要会话处于活动状态或只要 cookie 通过其$duration
(以秒为单位)保持有效,前提是 $enableAutoLogin 设置为true
。
如果 $enableSession 为 false
$duration
参数将被忽略
public boolean login ( yii\web\IdentityInterface $identity, $duration = 0 ) | ||
$identity | yii\web\IdentityInterface |
用户身份(应该已经通过身份验证) |
$duration | integer |
用户可以保持登录状态的秒数,默认为 |
返回值 | 布尔值 |
用户是否已登录 |
---|
public function login(IdentityInterface $identity, $duration = 0)
{
if ($this->beforeLogin($identity, false, $duration)) {
$this->switchIdentity($identity, $duration);
$id = $identity->getId();
$ip = Yii::$app->getRequest()->getUserIP();
if ($this->enableSession) {
$log = "User '$id' logged in from $ip with duration $duration.";
} else {
$log = "User '$id' logged in from $ip. Session not enabled.";
}
$this->regenerateCsrfToken();
Yii::info($log, __METHOD__);
$this->afterLogin($identity, false, $duration);
}
return !$this->getIsGuest();
}
使用给定的访问令牌登录用户。
此方法将首先通过调用 yii\web\IdentityInterface::findIdentityByAccessToken() 来使用提供的访问令牌对用户进行身份验证。如果成功,它将调用 login() 来登录已验证的用户。如果身份验证失败或 login() 不成功,它将返回 null。
public yii\web\IdentityInterface|null loginByAccessToken ( $token, $type = null ) | ||
$token | 字符串 |
访问令牌 |
$type | mixed |
令牌的类型。此参数的值取决于实现。例如,yii\filters\auth\HttpBearerAuth 将设置此参数为 |
返回值 | yii\web\IdentityInterface|空 |
与给定访问令牌关联的身份。如果访问令牌无效或 login() 不成功,则返回 Null。 |
---|
public function loginByAccessToken($token, $type = null)
{
/* @var $class IdentityInterface */
$class = $this->identityClass;
$identity = $class::findIdentityByAccessToken($token, $type);
if ($identity && $this->login($identity)) {
return $identity;
}
return null;
}
通过 cookie 登录用户。
此方法尝试使用 身份 cookie 提供的 ID 和 authKey 信息登录用户。
protected void loginByCookie ( ) |
protected function loginByCookie()
{
$data = $this->getIdentityAndDurationFromCookie();
if (isset($data['identity'], $data['duration'])) {
$identity = $data['identity'];
$duration = $data['duration'];
if ($this->beforeLogin($identity, true, $duration)) {
$this->switchIdentity($identity, $this->autoRenewCookie ? $duration : 0);
$id = $identity->getId();
$ip = Yii::$app->getRequest()->getUserIP();
Yii::info("User '$id' logged in from $ip via cookie.", __METHOD__);
$this->afterLogin($identity, true, $duration);
}
}
}
将用户浏览器重定向到登录页面。
在重定向之前,当前 URL(如果它不是 AJAX URL)将被保留为 $returnUrl,以便用户浏览器可以在成功登录后重定向回当前页面。
确保您设置了 $loginUrl,以便在调用此方法后,用户浏览器可以重定向到指定的登录 URL。
请注意,当 $loginUrl 设置后,调用此方法不会终止应用程序执行。
public yii\web\Response loginRequired ( $checkAjax = true, $checkAcceptHeader = true ) | ||
$checkAjax | 布尔值 |
是否检查请求是否为 AJAX 请求。当此值为 true 且请求为 AJAX 请求时,当前 URL(用于 AJAX 请求)将不会被设置为返回 URL。 |
$checkAcceptHeader | 布尔值 |
是否检查请求是否接受 HTML 响应。默认为 |
返回值 | yii\web\Response |
如果设置了 $loginUrl,则为重定向响应 |
---|---|---|
抛出 | yii\web\ForbiddenHttpException |
如果未设置 $loginUrl 或重定向不可用,则为“访问被拒绝” HTTP 异常。 |
public function loginRequired($checkAjax = true, $checkAcceptHeader = true)
{
$request = Yii::$app->getRequest();
$canRedirect = !$checkAcceptHeader || $this->checkRedirectAcceptable();
if (
$this->enableSession
&& $request->getIsGet()
&& (!$checkAjax || !$request->getIsAjax())
&& $canRedirect
) {
$this->setReturnUrl($request->getAbsoluteUrl());
}
if ($this->loginUrl !== null && $canRedirect) {
$loginUrl = (array) $this->loginUrl;
if ($loginUrl[0] !== Yii::$app->requestedRoute) {
return Yii::$app->getResponse()->redirect($this->loginUrl);
}
}
throw new ForbiddenHttpException(Yii::t('yii', 'Login Required'));
}
注销当前用户。
这将删除与身份验证相关的会话数据。如果 $destroySession
为 true,则将删除所有会话数据。
public boolean logout ( $destroySession = true ) | ||
$destroySession | 布尔值 |
是否销毁整个会话。默认为 true。如果 $enableSession 为 false,则忽略此参数。 |
返回值 | 布尔值 |
用户是否已注销 |
---|
public function logout($destroySession = true)
{
$identity = $this->getIdentity();
if ($identity !== null && $this->beforeLogout($identity)) {
$this->switchIdentity(null);
$id = $identity->getId();
$ip = Yii::$app->getRequest()->getUserIP();
Yii::info("User '$id' logged out from $ip.", __METHOD__);
if ($destroySession && $this->enableSession) {
Yii::$app->getSession()->destroy();
}
$this->afterLogout($identity);
}
return $this->getIsGuest();
}
定义于: yii\base\Component::off()
从该组件分离现有事件处理程序。
此方法与 on() 相反。
注意:如果事件名称传递通配符模式,则只会删除使用此通配符注册的处理程序,而使用与此通配符匹配的普通名称注册的处理程序将保留。
另见 on()。
public boolean off ( $name, $handler = null ) | ||
$name | 字符串 |
事件名称 |
$handler | callable|null |
要删除的事件处理程序。如果为 null,则将删除附加到命名事件的所有处理程序。 |
返回值 | 布尔值 |
如果找到并分离了处理程序,则 |
---|
public function off($name, $handler = null)
{
$this->ensureBehaviors();
if (empty($this->_events[$name]) && empty($this->_eventWildcards[$name])) {
return false;
}
if ($handler === null) {
unset($this->_events[$name], $this->_eventWildcards[$name]);
return true;
}
$removed = false;
// plain event names
if (isset($this->_events[$name])) {
foreach ($this->_events[$name] as $i => $event) {
if ($event[0] === $handler) {
unset($this->_events[$name][$i]);
$removed = true;
}
}
if ($removed) {
$this->_events[$name] = array_values($this->_events[$name]);
return true;
}
}
// wildcard event names
if (isset($this->_eventWildcards[$name])) {
foreach ($this->_eventWildcards[$name] as $i => $event) {
if ($event[0] === $handler) {
unset($this->_eventWildcards[$name][$i]);
$removed = true;
}
}
if ($removed) {
$this->_eventWildcards[$name] = array_values($this->_eventWildcards[$name]);
// remove empty wildcards to save future redundant regex checks:
if (empty($this->_eventWildcards[$name])) {
unset($this->_eventWildcards[$name]);
}
}
}
return $removed;
}
将事件处理程序附加到事件。
事件处理程序必须是有效的 PHP 回调。以下是一些示例
function ($event) { ... } // anonymous function
[$object, 'handleClick'] // $object->handleClick()
['Page', 'handleClick'] // Page::handleClick()
'handleClick' // global function handleClick()
事件处理程序必须使用以下签名定义,
function ($event)
其中 $event
是一个 yii\base\Event 对象,其中包含与事件相关的参数。
从 2.0.14 版本开始,你可以使用通配符模式指定事件名称。
$component->on('event.group.*', function ($event) {
Yii::trace($event->name . ' is triggered.');
});
另请参阅 off()。
public void on ( $name, $handler, $data = null, $append = true ) | ||
$name | 字符串 |
事件名称 |
$handler | 可调用 |
事件处理程序 |
$data | mixed |
触发事件时传递给事件处理程序的数据。当调用事件处理程序时,可以通过 yii\base\Event::$data 访问此数据。 |
$append | 布尔值 |
是否将新的事件处理程序追加到现有处理程序列表的末尾。如果为 false,则新的处理程序将插入到现有处理程序列表的开头。 |
public function on($name, $handler, $data = null, $append = true)
{
$this->ensureBehaviors();
if (strpos($name, '*') !== false) {
if ($append || empty($this->_eventWildcards[$name])) {
$this->_eventWildcards[$name][] = [$handler, $data];
} else {
array_unshift($this->_eventWildcards[$name], [$handler, $data]);
}
return;
}
if ($append || empty($this->_events[$name])) {
$this->_events[$name][] = [$handler, $data];
} else {
array_unshift($this->_events[$name], [$handler, $data]);
}
}
重新生成 CSRF 令牌
protected void regenerateCsrfToken ( ) |
protected function regenerateCsrfToken()
{
$request = Yii::$app->getRequest();
if ($request->enableCsrfCookie || $this->enableSession) {
$request->getCsrfToken(true);
}
}
删除身份 cookie。
当 $enableAutoLogin 为 true 时,将使用此方法。
protected void removeIdentityCookie ( ) |
protected function removeIdentityCookie()
{
Yii::$app->getResponse()->getCookies()->remove(Yii::createObject(array_merge($this->identityCookie, [
'class' => 'yii\web\Cookie',
])));
}
使用来自会话和 cookie 的信息更新身份验证状态。
此方法将尝试使用 $idParam 会话变量来确定用户身份。
如果设置了 $authTimeout,此方法将刷新计时器。
如果无法通过会话确定用户身份,则此方法将尝试 通过 Cookie 登录(如果 $enableAutoLogin 为 true)。
protected void renewAuthStatus ( ) |
protected function renewAuthStatus()
{
$session = Yii::$app->getSession();
$id = $session->getHasSessionId() || $session->getIsActive() ? $session->get($this->idParam) : null;
if ($id === null) {
$identity = null;
} else {
/* @var $class IdentityInterface */
$class = $this->identityClass;
$identity = $class::findIdentity($id);
if ($identity === null) {
$this->switchIdentity(null);
}
}
if ($identity !== null) {
$authKey = $session->get($this->authKeyParam);
if ($authKey !== null && !$identity->validateAuthKey($authKey)) {
$identity = null;
$ip = Yii::$app->getRequest()->getUserIP();
Yii::warning("Invalid session auth key attempted for user '$id' from $ip: $authKey", __METHOD__);
}
}
$this->setIdentity($identity);
if ($identity !== null && ($this->authTimeout !== null || $this->absoluteAuthTimeout !== null)) {
$expire = $this->authTimeout !== null ? $session->get($this->authTimeoutParam) : null;
$expireAbsolute = $this->absoluteAuthTimeout !== null ? $session->get($this->absoluteAuthTimeoutParam) : null;
if ($expire !== null && $expire < time() || $expireAbsolute !== null && $expireAbsolute < time()) {
$this->logout(false);
} elseif ($this->authTimeout !== null) {
$session->set($this->authTimeoutParam, time() + $this->authTimeout);
}
}
if ($this->enableAutoLogin) {
if ($this->getIsGuest()) {
$this->loginByCookie();
} elseif ($this->autoRenewCookie) {
$this->renewIdentityCookie();
}
}
}
更新身份 cookie。
此方法将设置身份 Cookie 的过期时间为当前时间加上最初指定的 Cookie 时长。
protected void renewIdentityCookie ( ) |
protected function renewIdentityCookie()
{
$name = $this->identityCookie['name'];
$value = Yii::$app->getRequest()->getCookies()->getValue($name);
if ($value !== null) {
$data = json_decode($value, true);
if (is_array($data) && isset($data[2])) {
$cookie = Yii::createObject(array_merge($this->identityCookie, [
'class' => 'yii\web\Cookie',
'value' => $value,
'expire' => time() + (int) $data[2],
]));
Yii::$app->getResponse()->getCookies()->add($cookie);
}
}
}
发送身份 cookie。
当 $enableAutoLogin 为 true 时,将使用此方法。它将在 Cookie 中保存 $id、身份验证密钥 以及基于 Cookie 的登录信息时长。
另请参阅 loginByCookie().
protected void sendIdentityCookie ( $identity, $duration ) | ||
$identity | yii\web\IdentityInterface | |
$duration | integer |
用户可以保持登录状态的秒数。 |
protected function sendIdentityCookie($identity, $duration)
{
$cookie = Yii::createObject(array_merge($this->identityCookie, [
'class' => 'yii\web\Cookie',
'value' => json_encode([
$identity->getId(),
$identity->getAuthKey(),
$duration,
], JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE),
'expire' => time() + $duration,
]));
Yii::$app->getResponse()->getCookies()->add($cookie);
}
设置用户身份对象。
请注意,此方法不处理会话或 Cookie。通常,你应该使用 switchIdentity() 来更改当前用户的身份。
public void setIdentity ( $identity ) | ||
$identity | yii\web\IdentityInterface|空 |
与当前登录用户关联的身份对象。如果为 null,则表示当前用户将是没有任何关联身份的访客。 |
抛出 | yii\base\InvalidValueException |
如果 |
---|
public function setIdentity($identity)
{
if ($identity instanceof IdentityInterface) {
$this->_identity = $identity;
} elseif ($identity === null) {
$this->_identity = null;
} else {
throw new InvalidValueException('The identity object must implement IdentityInterface.');
}
$this->_access = [];
}
在会话中记住 URL,以便以后可以通过 getReturnUrl() 检索回来。
public void setReturnUrl ( $url ) | ||
$url | string|array |
用户登录后应重定向到的 URL。如果提供数组,则会调用 yii\web\UrlManager::createUrl() 来创建相应的 URL。数组的第一个元素应该是路由,其余的键值对是用于构造 URL 的 GET 参数。例如,
|
public function setReturnUrl($url)
{
Yii::$app->getSession()->set($this->returnUrlParam, $url);
}
切换到当前用户的新的身份。
当 $enableSession 为 true 时,此方法可能会根据 $duration
的值使用会话和/或 Cookie 来存储用户身份信息。有关更多详细信息,请参阅 login()。
此方法主要由 login()、logout() 和 loginByCookie() 调用,当当前用户需要与相应的身份信息关联时。
public void switchIdentity ( $identity, $duration = 0 ) | ||
$identity | yii\web\IdentityInterface|空 |
要与当前用户关联的身份信息。如果为 null,则表示将当前用户切换为访客。 |
$duration | integer |
用户可以保持登录状态的秒数。此参数仅在 |
public function switchIdentity($identity, $duration = 0)
{
$this->setIdentity($identity);
if (!$this->enableSession) {
return;
}
/* Ensure any existing identity cookies are removed. */
if ($this->enableAutoLogin && ($this->autoRenewCookie || $identity === null)) {
$this->removeIdentityCookie();
}
$session = Yii::$app->getSession();
$session->regenerateID(true);
$session->remove($this->idParam);
$session->remove($this->authTimeoutParam);
$session->remove($this->authKeyParam);
if ($identity) {
$session->set($this->idParam, $identity->getId());
$session->set($this->authKeyParam, $identity->getAuthKey());
if ($this->authTimeout !== null) {
$session->set($this->authTimeoutParam, time() + $this->authTimeout);
}
if ($this->absoluteAuthTimeout !== null) {
$session->set($this->absoluteAuthTimeoutParam, time() + $this->absoluteAuthTimeout);
}
if ($this->enableAutoLogin && $duration > 0) {
$this->sendIdentityCookie($identity, $duration);
}
}
}
public void trigger ( $name, yii\base\Event $event = null ) | ||
$name | 字符串 |
事件名称 |
$event | yii\base\Event|null |
事件实例。如果未设置,则将创建一个默认的 yii\base\Event 对象。 |
public function trigger($name, Event $event = null)
{
$this->ensureBehaviors();
$eventHandlers = [];
foreach ($this->_eventWildcards as $wildcard => $handlers) {
if (StringHelper::matchWildcard($wildcard, $name)) {
$eventHandlers[] = $handlers;
}
}
if (!empty($this->_events[$name])) {
$eventHandlers[] = $this->_events[$name];
}
if (!empty($eventHandlers)) {
$eventHandlers = call_user_func_array('array_merge', $eventHandlers);
if ($event === null) {
$event = new Event();
}
if ($event->sender === null) {
$event->sender = $this;
}
$event->handled = false;
$event->name = $name;
foreach ($eventHandlers as $handler) {
$event->data = $handler[1];
call_user_func($handler[0], $event);
// stop further handling if the event is handled
if ($event->handled) {
return;
}
}
}
// invoke class-level attached handlers
Event::trigger($this, $name, $event);
}
注册 或 登录 以发表评论。