Самая простая базовая аутентификация в Yii2 - реализация IdentityInterface - PullRequest
1 голос
/ 17 октября 2019

Я хотел бы добавить базовую аутентификацию HTTP в мое приложение Yii2, в котором имя пользователя / пароль хранятся в файле конфигурации Yii - только для одного пользователя, без аутентификации БД.

Я включил аутентификацию для своегоконтроллер, добавив behaviors функцию:

public function behaviors()
    {
        return [
            'basicAuth' => [
                'class' => \yii\filters\auth\HttpBasicAuth::className(),
                'auth' => function ($username, $password) {
                    if ($username=='api') {
                        return new SimpleApiUser();
                    } else {
                        return null;
                    }
                },
            ],
        ];
    }

И мне нужно было создать класс, который реализует IdentityInterface, поэтому у меня есть класс:

class SimpleApiUser implements IdentityInterface {

    public static function findIdentity($id)
    {
        return null;
    }

    public static function findIdentityByAccessToken($token, $type = null)
    {
        return null;
    }

    public function getId()
    {
        return 1;
    }

    public function getAuthKey()
    {
        return 1;
    }

    public function validateAuthKey($authKey)
    {
        return true;
    }
}

Это нормально,приложение запрашивает имя пользователя / пароль в случае первого запроса, но затем ему удалось каким-то образом сохранить аутентификацию в каком-то внутреннем сеансе, и оно не требует повторной аутентификации для каждого нового запроса, будь это сделано из браузера (который мои сеансы добавления)или быть с почтальоном (который, конечно, не держит сессии). Возможно ли изменить класс пользователя так, чтобы он требовал указывать имя пользователя и пароль при каждом новом запросе?

1 Ответ

2 голосов
/ 19 октября 2019

Я попытался немного поиграться с вашим кодом.

Во-первых, вашего кода достаточно, чтобы базовый аутентификатор составлял часть каждого запроса . Если заголовок Authorization отсутствует в запросе, yii вернет 401 Unauthorized. Таким образом, ваша реализация уже делает то, что вам нужно.

Существуют причины, по которым пользователю не требуется каждый раз вводить имя пользователя / пароль.

Для веб-браузеров: учетные данные сохраняются для сеанса ибраузер будет отправлять их автоматически при каждом последующем запросе, не запрашивая их снова у пользователя.

Для почтальона: авторизация сохраняется для запроса, пока вы не удалите настройки авторизации вручную, они будут отправлены как частькаждый запрос. postman

Если вы хотите, чтобы пользователи вручную вводили имя пользователя / пароль при каждом запросе, вы можете расширить компонент 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, поэтому сеансы работают с почтальоном.

...