Я попытался немного поиграться с вашим кодом.
Во-первых, вашего кода достаточно, чтобы базовый аутентификатор составлял часть каждого запроса . Если заголовок Authorization
отсутствует в запросе, yii вернет 401 Unauthorized
. Таким образом, ваша реализация уже делает то, что вам нужно.
Существуют причины, по которым пользователю не требуется каждый раз вводить имя пользователя / пароль.
Для веб-браузеров: учетные данные сохраняются для сеанса ибраузер будет отправлять их автоматически при каждом последующем запросе, не запрашивая их снова у пользователя.
Для почтальона: авторизация сохраняется для запроса, пока вы не удалите настройки авторизации вручную, они будут отправлены как частькаждый запрос.
Если вы хотите, чтобы пользователи вручную вводили имя пользователя / пароль при каждом запросе, вы можете расширить компонент HttpBasicAuth, чтобы сделать вид, что авторизация не была частью запроса для каждого другого запроса. вот так
use Yii;
use yii\filters\auth\HttpBasicAuth;
class MyHttpBasicAuth extends HttpBasicAuth
{
const SESSION_KEY = 'authForced';
private $session;
public function __construct($config = [])
{
parent::__construct($config);
$this->session = Yii::$app->session;
}
public function authenticate($user, $request, $response)
{
if ($this->session->has(self::SESSION_KEY)) {
$this->session->remove(self::SESSION_KEY);
return parent::authenticate($user, $request, $response);
}
$this->session->set(self::SESSION_KEY, true);
return null;
}
}
Но для этого потребуются сеансы, поэтому его можно использовать только с браузерами. Это не будет хорошо работать для API. Для почтальона эта реализация приведет к сбою любого другого запроса с 401 Unauthorized
. В случае API, который будет работать с файлами cookie, он не будет работать так же, как и при каждом запросе API, который не будет работать с файлами cookie.
Примечание: Почтальон сохраняет / отправляет файлы cookie, поэтому сеансы работают с почтальоном.