User Log Out

Всё что касается построения API
Ответить
shkarbatov
Сообщения: 423
Зарегистрирован: 2012.12.10, 14:19
Откуда: Россия

User Log Out

Сообщение shkarbatov »

Всем привет, возник вопрос в правильности действий.
Делаю LogOut для пользователя.

Есть метод в контроллере:

Код: Выделить всё

    public function actionLogOut()
    {
        User::removeIdentityByAccessToken(Yii::$app->user->identity['auth_key']);
    }
 
Есть модель User, в которой обнуляется токен в БД.

Код: Выделить всё

class User extends ActiveRecord implements IdentityInterface
{
    public static function removeIdentityByAccessToken($token)
    {
        $record = static::findIdentityByAccessToken($token);
        $record->auth_key = NULL;
        $record->update();
    }
} 

Код: Выделить всё

Yii::$app->user->logout(); 
Не подойдет, так как надо удалять запись в БД при выхода, либо переопределить как-то метод.

Подскажите пожалуйста, у кого какие идеи.
Аватара пользователя
jilizart
Сообщения: 82
Зарегистрирован: 2010.04.22, 18:56
Контактная информация:

Re: User Log Out

Сообщение jilizart »

Берем и прямо в конфиге фигачим

Код: Выделить всё

        'user' => [
            'class' => 'yii\web\User',
            'identityClass' => User::className(),
            'loginUrl' => ['/user/login'],
            'enableAutoLogin' => true,

            'on afterLogout' => function($identity) {
                return User::removeIdentityByAccessToken($identity['auth_key']);
            }
        ],
Вместо анонимной функции можно передать callable массив
shkarbatov
Сообщения: 423
Зарегистрирован: 2012.12.10, 14:19
Откуда: Россия

Re: User Log Out

Сообщение shkarbatov »

Да, точно, спасибо.

Только так не работает

Код: Выделить всё

'identityClass' => User::className(), 
Работает только если в ручную прописать

Код: Выделить всё

'identityClass' => 'app\models\User', 
И немного не понятно для чего это?

Код: Выделить всё

'loginUrl' => ['/user/login'], 
Что бы знать куда переадресовывать неавторизованных пользователей?
shkarbatov
Сообщения: 423
Зарегистрирован: 2012.12.10, 14:19
Откуда: Россия

Re: User Log Out

Сообщение shkarbatov »

Ну и по идее надо параметр в методе немного другой передавать:

Код: Выделить всё

return User::removeIdentityByAccessToken($identity->identity['auth_key']) 
shkarbatov
Сообщения: 423
Зарегистрирован: 2012.12.10, 14:19
Откуда: Россия

Re: User Log Out

Сообщение shkarbatov »

Так как $identity на самом деле ивент =)
Аватара пользователя
jilizart
Сообщения: 82
Зарегистрирован: 2010.04.22, 18:56
Контактная информация:

Re: User Log Out

Сообщение jilizart »

Ну вот и отлично, сам разобрался )
shkarbatov
Сообщения: 423
Зарегистрирован: 2012.12.10, 14:19
Откуда: Россия

Re: User Log Out

Сообщение shkarbatov »

И немного не понятно для чего это?

Код: Выделить всё

'loginUrl' => ['/user/login'],  
Что бы знать куда переадресовывать неавторизованных пользователей?

Просто немного не понятно зачем оно нужно в REST?
Аватара пользователя
jilizart
Сообщения: 82
Зарегистрирован: 2010.04.22, 18:56
Контактная информация:

Re: User Log Out

Сообщение jilizart »

Это всего лишь пример, это не обязательный параметр. Это уже на твое усмотрение
Но если ты делаешь REST API, лучше следовать принципу stateless, который не требует использования $app->user->logout(), т.к система ничего не знает о текущем пользователе и не создает сессию для него. Просто отдает данные на основе переданного токена пользователя.
А если токен истек, просто возвращать ошибку что токен истек и нужно получить новый. Сам метод $app->user->logout() может понадобится только из-за событий которые он генерирует.
Если нужен метод чтобы забыть токен, то он не должен называться logout я думаю.
shkarbatov
Сообщения: 423
Зарегистрирован: 2012.12.10, 14:19
Откуда: Россия

Re: User Log Out

Сообщение shkarbatov »

Да, согласен. Спасибо.
Ответить