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;
            },
        ],
    ];
}

提示: 如果驗證未如預期般運作,請確認您的網頁伺服器有將使用者名稱和密碼傳遞至 $_SERVER['PHP_AUTH_USER']$_SERVER['PHP_AUTH_PW'] 變數。如果您使用 Apache 搭配 PHP-CGI,您可能需要在您的 .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 mixed __call ( $name, $params )
$name string

方法名稱

$params array

方法參數

return mixed

方法傳回值

throws 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 mixed __get ( $name )
$name string

屬性名稱

return mixed

屬性值

throws yii\base\UnknownPropertyException

如果屬性未定義

throws 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.dev.org.tw/manual/en/function.isset.php

public boolean __isset ( $name )
$name string

屬性名稱或事件名稱

return boolean

具名的屬性是否已設定(非 null)。

                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 mixed

屬性值

throws yii\base\UnknownPropertyException

如果屬性未定義

throws 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.dev.org.tw/manual/en/function.unset.php

public void __unset ( $name )
$name string

屬性名稱

throws 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 mixed afterAction ( $action, $result )
$action yii\base\Action

剛執行的動作。

$result mixed

動作執行結果

return mixed

已處理的動作結果。

                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|null authenticate ( $user, $request, $response )
$user yii\web\User
$request yii\web\Request
$response yii\web\Response
return yii\web\IdentityInterface|null

已驗證的使用者身分。如果未提供驗證資訊,將傳回 null。

throws 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 boolean beforeAction ( $action )
$action yii\base\Action

要執行的動作。

return boolean

動作是否應繼續執行。

                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 boolean

是否將成員變數視為屬性

return boolean

屬性是否可讀取

                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 boolean

是否將成員變數視為屬性

return boolean

屬性是否可寫入

                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 ( )
return 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 ( )
return 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
throws 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

方法名稱

return boolean

方法是否已定義

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

            
hasProperty() public method

Defined in: yii\base\BaseObject::hasProperty()

傳回一個值,指示屬性是否已定義。

屬性已定義若

  • 類別具有與指定名稱相關聯的 getter 或 setter 方法(在這種情況下,屬性名稱不區分大小寫);
  • 類別具有指定名稱的成員變數(當 $checkVars 為 true 時);

參見

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

屬性名稱

$checkVars boolean

是否將成員變數視為屬性

return boolean

屬性是否已定義

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

            
init() public method

Defined in: yii\base\BaseObject::init()

初始化物件。

在物件以給定配置初始化之後,此方法會在建構函式的結尾被調用。

public void init ( )

                public function init()
{
}

            
isActive() protected method

Defined in: yii\base\ActionFilter::isActive()

傳回一個值,指示篩選器對於給定的動作是否為啟用狀態。

protected boolean isActive ( $action )
$action yii\base\Action

正在被過濾的動作

return boolean

篩選器對於給定動作是否為啟用狀態。

                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() protected method (available since version 2.0.7)

Defined in: yii\filters\auth\AuthMethod::isOptional()

檢查對於給定的動作,驗證是否為可選。

參見 $optional

protected boolean isOptional ( $action )
$action yii\base\Action

要檢查的動作。

return boolean

驗證是否為選用性。

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