0 关注者

类 yii\filters\auth\HttpBasicAuth

继承关系yii\filters\auth\HttpBasicAuth » yii\filters\auth\AuthMethod » yii\base\ActionFilter » yii\base\Behavior » yii\base\BaseObject
实现yii\base\Configurable, yii\filters\auth\AuthInterface
可用版本2.0
源代码 https://github.com/yiisoft/yii2/blob/master/framework/filters/auth/HttpBasicAuth.php

HttpBasicAuth 是一个支持 HTTP 基本认证方法的动作过滤器。

您可以通过将其作为行为附加到控制器或模块来使用 HttpBasicAuth,如下所示

public function behaviors()
{
    return [
        'basicAuth' => [
            'class' => \yii\filters\auth\HttpBasicAuth::class,
        ],
    ];
}

HttpBasicAuth 的默认实现使用 user 应用组件的 loginByAccessToken() 方法,并且只传递用户名。此实现用于对 API 客户端进行身份验证。

如果您想使用用户名和密码对用户进行身份验证,则应提供 $auth 函数,例如以下示例

public function behaviors()
{
    return [
        'basicAuth' => [
            'class' => \yii\filters\auth\HttpBasicAuth::class,
            'auth' => function ($username, $password) {
                $user = User::find()->where(['username' => $username])->one();
                if ($user && $user->validatePassword($password)) {
                    return $user;
                }
                return null;
            },
        ],
    ];
}

提示:如果身份验证无法按预期工作,请确保您的 Web 服务器将用户名和密码传递到 $_SERVER['PHP_AUTH_USER']$_SERVER['PHP_AUTH_PW'] 变量。如果您使用的是带有 PHP-CGI 的 Apache,则可能需要将以下行添加到您的 .htaccess 文件中:RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization},L]

公共属性

隐藏继承的属性

属性 类型 描述 定义于
$auth callable|null 一个 PHP 可调用对象,用于使用 HTTP 基本身份验证信息对用户进行身份验证。 yii\filters\auth\HttpBasicAuth
$except array 此过滤器不应应用于的操作 ID 列表。 yii\base\ActionFilter
$only array 此过滤器应应用于的操作 ID 列表。 yii\base\ActionFilter
$optional array 此过滤器将应用于的操作 ID 列表,但身份验证失败不会导致错误。 yii\filters\auth\AuthMethod
$owner yii\base\Component|null 此行为的所有者 yii\base\Behavior
$realm string HTTP 身份验证域 yii\filters\auth\HttpBasicAuth
$request yii\web\Request|null 当前请求。 yii\filters\auth\AuthMethod
$response yii\web\Response|null 要发送的响应。 yii\filters\auth\AuthMethod
$user yii\web\User|null 表示用户身份验证状态的用户对象。 yii\filters\auth\AuthMethod

公共方法

隐藏继承的方法

方法 描述 定义于
__call() 调用不是类方法的命名方法。 yii\base\BaseObject
__construct() 构造函数。 yii\base\BaseObject
__get() 返回对象属性的值。 yii\base\BaseObject
__isset() 检查属性是否已设置,即定义且不为 null。 yii\base\BaseObject
__set() 设置对象属性的值。 yii\base\BaseObject
__unset() 将对象属性设置为 null。 yii\base\BaseObject
afterAction() 此方法在操作执行后立即调用。 yii\base\ActionFilter
afterFilter() yii\base\ActionFilter
attach() 将行为对象附加到组件。 yii\base\ActionFilter
authenticate() 对当前用户进行身份验证。 yii\filters\auth\HttpBasicAuth
beforeAction() 此方法在操作即将执行之前调用(在所有可能的过滤器之后)。您可以覆盖此方法以对操作进行最后一刻的准备。 yii\filters\auth\AuthMethod
beforeFilter() yii\base\ActionFilter
canGetProperty() 返回一个值,指示是否可以读取属性。 yii\base\BaseObject
canSetProperty() 返回一个值,指示是否可以设置属性。 yii\base\BaseObject
challenge() 身份验证失败时生成挑战。 yii\filters\auth\HttpBasicAuth
className() 返回此类的完全限定名称。 yii\base\BaseObject
detach() 将行为对象从组件中分离。 yii\base\ActionFilter
events() 声明 $owner 事件的事件处理程序。 yii\base\Behavior
handleFailure() 处理身份验证失败。 yii\filters\auth\AuthMethod
hasMethod() 返回一个值,指示方法是否已定义。 yii\base\BaseObject
hasProperty() 返回一个值,指示属性是否已定义。 yii\base\BaseObject
init() 初始化对象。 yii\base\BaseObject

受保护的方法

隐藏继承的方法

方法 描述 定义于
getActionId() 通过将 yii\base\Action::$uniqueId 转换为相对于模块的 ID 来返回操作 ID。 yii\base\ActionFilter
isActive() 返回一个值,指示过滤器对于给定操作是否处于活动状态。 yii\base\ActionFilter
isOptional() 检查给定操作的身份验证是否可选。 yii\filters\auth\AuthMethod

属性详情

隐藏继承的属性

$auth 公共属性

一个 PHP 可调用对象,用于使用 HTTP 基本身份验证信息对用户进行身份验证。此可调用对象接收用户名和密码作为其参数。它应该返回与用户名和密码匹配的身份对象。如果没有这样的身份,则应返回 Null。只有在当前用户未经身份验证时才会调用此可调用对象。

以下代码是此可调用对象的典型实现

function ($username, $password) {
    return \app\models\User::findOne([
        'username' => $username,
        'password' => $password,
    ]);
}

如果未设置此属性,则用户名信息将被视为访问令牌,而密码信息将被忽略。将调用 yii\web\User::loginByAccessToken() 方法来对用户进行身份验证和登录。

public callable|null $auth null
$realm 公共属性

HTTP 身份验证域

public string $realm 'api'

方法详情

隐藏继承的方法

__call() 公共方法

定义于: yii\base\BaseObject::__call()

调用不是类方法的命名方法。

不要直接调用此方法,因为它是一个 PHP 魔术方法,当调用未知方法时会隐式调用。

public 混合 __call ( $name, $params )
$name string

方法名称

$params array

方法参数

返回值 混合

方法的返回值

抛出异常 yii\base\UnknownMethodException

调用未知方法时

                public function __call($name, $params)
{
    throw new UnknownMethodException('Calling unknown method: ' . get_class($this) . "::$name()");
}

            
__construct() 公共方法

定义于: yii\base\BaseObject::__construct()

构造函数。

默认实现执行两件事

  • 使用给定的配置 $config 初始化对象。
  • 调用 init()

如果此方法在子类中被重写,建议

  • 构造函数的最后一个参数是一个配置数组,如这里的 $config
  • 在构造函数的末尾调用父类的实现。
public void __construct ( $config = [] )
$config array

用于初始化对象属性的名称-值对

                public function __construct($config = [])
{
    if (!empty($config)) {
        Yii::configure($this, $config);
    }
    $this->init();
}

            
__get() 公共方法

定义于: yii\base\BaseObject::__get()

返回对象属性的值。

不要直接调用此方法,因为它是一个 PHP 魔术方法,在执行 $value = $object->property; 时会被隐式调用。

另见 __set()

public 混合 __get ( $name )
$name string

属性名称

返回值 混合

属性值

抛出异常 yii\base\UnknownPropertyException

如果属性未定义

抛出异常 yii\base\InvalidCallException

如果属性是只写属性

                public function __get($name)
{
    $getter = 'get' . $name;
    if (method_exists($this, $getter)) {
        return $this->$getter();
    } elseif (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);
}

            
__isset() 公共方法

定义于: yii\base\BaseObject::__isset()

检查属性是否已设置,即定义且不为 null。

不要直接调用此方法,因为它是一个 PHP 魔术方法,在执行 isset($object->property) 时会被隐式调用。

请注意,如果属性未定义,则将返回 false。

另见 https://php.ac.cn/manual/en/function.isset.php

public 布尔值 __isset ( $name )
$name string

属性名称或事件名称

返回值 布尔值

命名的属性是否已设置(非空)。

                public function __isset($name)
{
    $getter = 'get' . $name;
    if (method_exists($this, $getter)) {
        return $this->$getter() !== null;
    }
    return false;
}

            
__set() 公共方法

定义于: yii\base\BaseObject::__set()

设置对象属性的值。

不要直接调用此方法,因为它是一个 PHP 魔术方法,在执行 $object->property = $value; 时会被隐式调用。

另见 __get()

public void __set ( $name, $value )
$name string

属性名称或事件名称

$value 混合

属性值

抛出异常 yii\base\UnknownPropertyException

如果属性未定义

抛出异常 yii\base\InvalidCallException

如果属性是只读属性

                public function __set($name, $value)
{
    $setter = 'set' . $name;
    if (method_exists($this, $setter)) {
        $this->$setter($value);
    } elseif (method_exists($this, 'get' . $name)) {
        throw new InvalidCallException('Setting read-only property: ' . get_class($this) . '::' . $name);
    } else {
        throw new UnknownPropertyException('Setting unknown property: ' . get_class($this) . '::' . $name);
    }
}

            
__unset() 公共方法

定义于: yii\base\BaseObject::__unset()

将对象属性设置为 null。

不要直接调用此方法,因为它是一个 PHP 魔术方法,在执行 unset($object->property) 时会被隐式调用。

请注意,如果属性未定义,则此方法将不执行任何操作。如果属性是只读属性,则将抛出异常。

另见 https://php.ac.cn/manual/en/function.unset.php

public void __unset ( $name )
$name string

属性名称

抛出异常 yii\base\InvalidCallException

如果属性是只读属性。

                public function __unset($name)
{
    $setter = 'set' . $name;
    if (method_exists($this, $setter)) {
        $this->$setter(null);
    } elseif (method_exists($this, 'get' . $name)) {
        throw new InvalidCallException('Unsetting read-only property: ' . get_class($this) . '::' . $name);
    }
}

            
afterAction() 公共方法

定义于: yii\base\ActionFilter::afterAction()

此方法在操作执行后立即调用。

您可以重写此方法以对操作执行一些后处理。

public 混合 afterAction ( $action, $result )
$action yii\base\Action

刚刚执行的操作。

$result 混合

操作执行结果

返回值 混合

处理后的操作结果。

                public function afterAction($action, $result)
{
    return $result;
}

            
afterFilter() 公共方法
public void afterFilter ( $event )
$event yii\base\ActionEvent

                public function afterFilter($event)
{
    $event->result = $this->afterAction($event->action, $event->result);
    $this->owner->off(Controller::EVENT_AFTER_ACTION, [$this, 'afterFilter']);
}

            
attach() 公共方法

定义于: yii\base\ActionFilter::attach()

将行为对象附加到组件。

默认实现将设置 $owner 属性并附加在 events() 中声明的事件处理程序。确保在重写此方法时调用父类的实现。

public void attach ( $owner )
$owner yii\base\Component

要将此行为附加到的组件。

                public function attach($owner)
{
    $this->owner = $owner;
    $owner->on(Controller::EVENT_BEFORE_ACTION, [$this, 'beforeFilter']);
}

            
authenticate() 公共方法

对当前用户进行身份验证。

public yii\web\IdentityInterface| authenticate ( $user, $request, $response )
$user yii\web\User
$request yii\web\Request
$response yii\web\Response
返回值 yii\web\IdentityInterface|

经过身份验证的用户身份。如果未提供身份验证信息,则返回 null。

抛出异常 yii\web\UnauthorizedHttpException

如果提供了身份验证信息但无效。

                public function authenticate($user, $request, $response)
{
    list($username, $password) = $request->getAuthCredentials();
    if ($this->auth) {
        if ($username !== null || $password !== null) {
            $identity = $user->getIdentity() ?: call_user_func($this->auth, $username, $password);
            if ($identity === null) {
                $this->handleFailure($response);
            } elseif ($user->getIdentity(false) !== $identity) {
                $user->login($identity);
            }
            return $identity;
        }
    } elseif ($username !== null) {
        $identity = $user->loginByAccessToken($username, get_class($this));
        if ($identity === null) {
            $this->handleFailure($response);
        }
        return $identity;
    }
    return null;
}

            
beforeAction() 公共方法

定义于: yii\filters\auth\AuthMethod::beforeAction()

此方法在操作即将执行之前调用(在所有可能的过滤器之后)。您可以覆盖此方法以对操作进行最后一刻的准备。

public 布尔值 beforeAction ( $action )
$action yii\base\Action

要执行的操作。

返回值 布尔值

操作是否应继续执行。

                public function beforeAction($action)
{
    $response = $this->response ?: Yii::$app->getResponse();
    try {
        $identity = $this->authenticate(
            $this->user ?: Yii::$app->getUser(),
            $this->request ?: Yii::$app->getRequest(),
            $response
        );
    } catch (UnauthorizedHttpException $e) {
        if ($this->isOptional($action)) {
            return true;
        }
        throw $e;
    }
    if ($identity !== null || $this->isOptional($action)) {
        return true;
    }
    $this->challenge($response);
    $this->handleFailure($response);
    return false;
}

            
beforeFilter() 公共方法
public void beforeFilter ( $event )
$event yii\base\ActionEvent

                public function beforeFilter($event)
{
    if (!$this->isActive($event->action)) {
        return;
    }
    $event->isValid = $this->beforeAction($event->action);
    if ($event->isValid) {
        // call afterFilter only if beforeFilter succeeds
        // beforeFilter and afterFilter should be properly nested
        $this->owner->on(Controller::EVENT_AFTER_ACTION, [$this, 'afterFilter'], null, false);
    } else {
        $event->handled = true;
    }
}

            
canGetProperty() 公共方法

定义于: yii\base\BaseObject::canGetProperty()

返回一个值,指示是否可以读取属性。

如果满足以下条件,则属性可读:

  • 类具有与指定名称关联的 getter 方法(在这种情况下,属性名称不区分大小写);
  • 类具有与指定名称相同的成员变量(当 $checkVars 为 true 时);

另请参阅 canSetProperty()

public boolean canGetProperty ( $name, $checkVars true )
$name string

属性名称

$checkVars 布尔值

是否将成员变量视为属性

返回值 布尔值

属性是否可读

                public function canGetProperty($name, $checkVars = true)
{
    return method_exists($this, 'get' . $name) || $checkVars && property_exists($this, $name);
}

            
canSetProperty() 公共方法

定义于: yii\base\BaseObject::canSetProperty()

返回一个值,指示是否可以设置属性。

如果满足以下条件,则属性可写:

  • 类具有与指定名称关联的 setter 方法(在这种情况下,属性名称不区分大小写);
  • 类具有与指定名称相同的成员变量(当 $checkVars 为 true 时);

另请参阅 canGetProperty()

public boolean canSetProperty ( $name, $checkVars true )
$name string

属性名称

$checkVars 布尔值

是否将成员变量视为属性

返回值 布尔值

属性是否可写

                public function canSetProperty($name, $checkVars = true)
{
    return method_exists($this, 'set' . $name) || $checkVars && property_exists($this, $name);
}

            
challenge() 公共方法

身份验证失败时生成挑战。

例如,可能会生成一些适当的 HTTP 标头。

public void challenge ( $response )
$response yii\web\Response

                public function challenge($response)
{
    $response->getHeaders()->set('WWW-Authenticate', "Basic realm=\"{$this->realm}\"");
}

            
className() 公共静态方法
自 2.0.14 版起已弃用。在 PHP >=5.5 上,请改用 ::class

定义于: yii\base\BaseObject::className()

返回此类的完全限定名称。

public static string className ( )
返回值 string

此类的完全限定名称。

                public static function className()
{
    return get_called_class();
}

            
detach() 公共方法

定义于: yii\base\ActionFilter::detach()

将行为对象从组件中分离。

默认实现将取消设置 $owner 属性并分离在 events() 中声明的事件处理程序。如果覆盖此方法,请确保调用父实现。

public void detach ( )

                public function detach()
{
    if ($this->owner) {
        $this->owner->off(Controller::EVENT_BEFORE_ACTION, [$this, 'beforeFilter']);
        $this->owner->off(Controller::EVENT_AFTER_ACTION, [$this, 'afterFilter']);
        $this->owner = null;
    }
}

            
events() 公共方法

定义于: yii\base\Behavior::events()

声明 $owner 事件的事件处理程序。

子类可以覆盖此方法来声明应将哪些 PHP 回调附加到 $owner 组件的事件。

当行为附加到所有者时,回调将附加到 $owner 的事件;当行为从组件分离时,它们将从事件中分离。

回调可以是以下任何一种:

  • 此行为中的方法:'handleClick',相当于 [$this, 'handleClick']
  • 对象方法:[$object, 'handleClick']
  • 静态方法:['Page', 'handleClick']
  • 匿名函数:function ($event) { ... }

以下是一个示例

[
    Model::EVENT_BEFORE_VALIDATE => 'myBeforeValidate',
    Model::EVENT_AFTER_VALIDATE => 'myAfterValidate',
]
public array events ( )
返回值 array

事件(数组键)和相应的事件处理程序方法(数组值)。

                public function events()
{
    return [];
}

            
getActionId() 受保护的方法(自版本 2.0.7 起可用)

定义于: yii\base\ActionFilter::getActionId()

通过将 yii\base\Action::$uniqueId 转换为相对于模块的 ID 来返回操作 ID。

protected string getActionId ( $action )
$action yii\base\Action

                protected function getActionId($action)
{
    if ($this->owner instanceof Module) {
        $mid = $this->owner->getUniqueId();
        $id = $action->getUniqueId();
        if ($mid !== '' && strpos($id, $mid) === 0) {
            $id = substr($id, strlen($mid) + 1);
        }
    } else {
        $id = $action->id;
    }
    return $id;
}

            
handleFailure() 公共方法

定义于: yii\filters\auth\AuthMethod::handleFailure()

处理身份验证失败。

实现通常应抛出 UnauthorizedHttpException 以指示身份验证失败。

public void handleFailure ( $response )
$response yii\web\Response
抛出异常 yii\web\UnauthorizedHttpException

                public function handleFailure($response)
{
    throw new UnauthorizedHttpException('Your request was made with invalid credentials.');
}

            
hasMethod() 公共方法

定义于: yii\base\BaseObject::hasMethod()

返回一个值,指示方法是否已定义。

默认实现是对 php 函数 method_exists() 的调用。当您实现 php 魔术方法 __call() 时,您可以覆盖此方法。

public boolean hasMethod ( $name )
$name string

方法名称

返回值 布尔值

方法是否已定义

                public function hasMethod($name)
{
    return method_exists($this, $name);
}

            
hasProperty() 公共方法

定义于: yii\base\BaseObject::hasProperty()

返回一个值,指示属性是否已定义。

如果满足以下条件,则属性已定义:

  • 类具有与指定名称关联的 getter 或 setter 方法(在这种情况下,属性名称不区分大小写);
  • 类具有与指定名称相同的成员变量(当 $checkVars 为 true 时);

另请参阅

public boolean hasProperty ( $name, $checkVars true )
$name string

属性名称

$checkVars 布尔值

是否将成员变量视为属性

返回值 布尔值

属性是否已定义

                public function hasProperty($name, $checkVars = true)
{
    return $this->canGetProperty($name, $checkVars) || $this->canSetProperty($name, false);
}

            
init() 公共方法

定义于: yii\base\BaseObject::init()

初始化对象。

此方法在构造函数结束时调用,在对象使用给定配置初始化之后调用。

public void init ( )

                public function init()
{
}

            
isActive() 受保护方法

定义于: yii\base\ActionFilter::isActive()

返回一个值,指示过滤器对于给定操作是否处于活动状态。

受保护 布尔值 isActive ( $action )
$action yii\base\Action

正在过滤的操作

返回值 布尔值

过滤器对于给定操作是否处于活动状态。

                protected function isActive($action)
{
    $id = $this->getActionId($action);
    if (empty($this->only)) {
        $onlyMatch = true;
    } else {
        $onlyMatch = false;
        foreach ($this->only as $pattern) {
            if (StringHelper::matchWildcard($pattern, $id)) {
                $onlyMatch = true;
                break;
            }
        }
    }
    $exceptMatch = false;
    foreach ($this->except as $pattern) {
        if (StringHelper::matchWildcard($pattern, $id)) {
            $exceptMatch = true;
            break;
        }
    }
    return !$exceptMatch && $onlyMatch;
}

            
isOptional() 受保护方法 (自版本 2.0.7 起可用)

定义于: yii\filters\auth\AuthMethod::isOptional()

检查给定操作的身份验证是否可选。

另请参阅 $optional

受保护 布尔值 isOptional ( $action )
$action yii\base\Action

要检查的操作。

返回值 布尔值

身份验证是否可选。

                protected function isOptional($action)
{
    $id = $this->getActionId($action);
    foreach ($this->optional as $pattern) {
        if (StringHelper::matchWildcard($pattern, $id)) {
            return true;
        }
    }
    return false;
}