Не обязательная аутентификация
Не обязательная аутентификация
Есть action в контроллере, который отдает информацию, он использует данные пользователя при выборке информации с бд, работает отлично, по токену проходит аутентификацию, потом авторизацию и получаем информацию по пользователю. Но появилась задача, нужно отдавать некоторую публичную информацию, без аутентификации, правки в action я дописал, но без токена, как и должно быть, выкидывало на 401 ошибку, тогда в поведении аутентификации я дописал "'except' => ['мой_action']", все заработало хорошо, но, появилась проблема следующего характера, этот action теперь не проходит аутентификацию вообще, что по логике так и должно, раз я прописал его в except, а она там нужна, если таки передается токен. Есть ли вариант оформить логику так, что бы, если токен не приходит, аутентификация просто не проходила, а если приходит, то проходила как положено. В голове пока крутиться только создание отдельного action, но не хотелось бы, в одном очень удобно.
"Все было хорошо, пока программирование не стало работой"
Re: Не обязательная аутентификация
Сделал вот такой костыль, думаю, что есть лучший способ, если кто-то напишет, буду очень признателен.
С самого начала аутентификация была такая:
Что происходило, проходили все методы и не дав положительного итоге, выкидывало на ошибку 401, мол, не авторизованный.
Я добавил еще один класс авторизации:
И добавил отредактировал само поведение, добавив для некоторых actions возможность выполнения без авторизации
Пройдя все методы аутентификации, последний отдаст true, типа, все окей, но в контроле доступа только нужным мне методам я разрешил выполняться без авторизации, таким образом все работает корректно, вроде)
С самого начала аутентификация была такая:
Код: Выделить всё
public function behaviors()
{
$behaviors = parent::behaviors();
$behaviors['authenticator'] = [
'class' => CompositeAuth::className(),
'authMethods' => [
HttpBasicAuth::className(),
HttpBearerAuth::className(),
QueryParamAuth::className(),
],
];
$behaviors['access'] = [
'class' => AccessControl::className(),
'rules' => [
[
'allow' => true,
'roles' => ['@'],
],
],
];
return $behaviors;
}
Я добавил еще один класс авторизации:
Код: Выделить всё
use yii\filters\auth\AuthMethod;
class NoAuth extends AuthMethod
{
public function authenticate($user, $request, $response)
{
return true;
}
}
Код: Выделить всё
public function behaviors()
{
$behaviors = parent::behaviors();
$behaviors['authenticator'] = [
'class' => CompositeAuth::className(),
'authMethods' => [
HttpBasicAuth::className(),
HttpBearerAuth::className(),
QueryParamAuth::className(),
NoAuth::className(),
],
];
$behaviors['access'] = [
'class' => AccessControl::className(),
'rules' => [
[
'allow' => true,
'roles' => ['@'],
],
[
'actions' => ['my-actions'],
'allow' => true,
'roles' => ['?', '@'],
],
],
];
return $behaviors;
}
"Все было хорошо, пока программирование не стало работой"