Почему после "включения" пользователя происходит автологин?

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
azz
Сообщения: 197
Зарегистрирован: 2016.07.06, 17:20

Почему после "включения" пользователя происходит автологин?

Сообщение azz »

Добрый день. Задача такая: если отключить пользователя из админки (путём записи в поле бд соотв. значения), он должен разлогиниться на сайте. Делаю так:

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

class FrontendController extends Controller {
    public function beforeAction($action) {
        if (!Yii::$app->user->isGuest && Yii::$app->user->identity->status === Users::STATUS_DISABLED) {
            Yii::$app->user->logout();
        }
        
        return parent::beforeAction($action);
    }
Всё работает как задумано, пользователя разлогинивает. Но потом, если его опять "включить", то он вновь авторизируется, автоматически. Мне непонятно почему. В конфиге main.php стоит 'enableAutoLogin' => true, но ведь разлогинивание ровно такое же как и при ручном actionLogout:

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

    public function actionLogout() {
        Yii::$app->user->logout();

        return $this->redirect(['site/index']);
    }
Можете объяснить?
Nex-Otaku
Сообщения: 831
Зарегистрирован: 2016.07.09, 21:07

Re: Почему после "включения" пользователя происходит автологин?

Сообщение Nex-Otaku »

Ну я вот вижу, что в одном случае редирект есть, во втором нет. Так что не совсем то же самое. Попробуй )
azz
Сообщения: 197
Зарегистрирован: 2016.07.06, 17:20

Re: Почему после "включения" пользователя происходит автологин?

Сообщение azz »

Попробовал, увидел что редирект не работает. Стал разбираться. В итоге оказалось:
1) команда Yii::$app->user->isGuest вызывает метод getIsGuest в vendor\yiisoft\yii2\base\Component.php;
2) getIsGuest вызывает метод getIdentity в vendor\yiisoft\yii2\web\User.php;
3) getIdentity вызывает метод renewAuthStatus в vendor\yiisoft\yii2\web\User.php;
4) renewAuthStatus вызывает метод findIdentity из моей уже модели, которая определена как identityClass:

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

class Users extends ActiveRecord implements IdentityInterface {

    // status
    const STATUS_DISABLED = 0;
    const STATUS_ACTIVE = 10;
    
......................    
    
    public static function findIdentity($id) {
        return static::findOne(['id' => $id, 'status' => self::STATUS_ACTIVE]);
    }
поскольку пользователя с заданным айди и статусом нет (пользователь отключен, status=0), возвращается null и Yii::$app->user->isGuest соответственно возвращает false. Т.е. разлогинивать уже некого, в Yii::$app->user->identity null.

Тупичок... Как же мне теперь разлогинить отключенного пользователя?
Аватара пользователя
Dominus
Сообщения: 892
Зарегистрирован: 2013.03.14, 21:27
Откуда: Россия, Иваново
Контактная информация:

Re: Почему после "включения" пользователя происходит автологин?

Сообщение Dominus »

Не спорь с дураком, иначе окружающие не правильно поймут кто из вас дурак!
azz
Сообщения: 197
Зарегистрирован: 2016.07.06, 17:20

Re: Почему после "включения" пользователя происходит автологин?

Сообщение azz »

Dominus писал(а): 2017.12.12, 12:30 Тут http://www.yiiframework.com/doc-2.0/gui ... ation.html смотрели?
Да. Но там именно по моей задаче ничего.

Будет ли корректным сделать так:

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

class Users extends ActiveRecord implements IdentityInterface {

    // status
    const STATUS_DISABLED = 0;
    const STATUS_ACTIVE = 10;

.....................................

    public static function findIdentity($id) {
        $user = static::findOne(['id' => $id]);
        
        if (is_null($user))
            return NULL;        
        
        if ($user->status !== self::STATUS_ACTIVE) {
            Yii::$app->user->logout();            
            return NULL;
        }
        
        return $user; //static::findOne(['id' => $id, 'status' => self::STATUS_ACTIVE]);
    }
:?:
azz
Сообщения: 197
Зарегистрирован: 2016.07.06, 17:20

Re: Почему после "включения" пользователя происходит автологин?

Сообщение azz »

и сам себе отвечу: нет, не помогает. Пользователя не разлогинивает. После его включения он автоматом логинится на сайте.
Nex-Otaku
Сообщения: 831
Зарегистрирован: 2016.07.09, 21:07

Re: Почему после "включения" пользователя происходит автологин?

Сообщение Nex-Otaku »

Нужно разлогинить пользователя в том же действии, где ему присваивается статус "DISABLED". То есть в момент обработки действий админа.
Аватара пользователя
Dominus
Сообщения: 892
Зарегистрирован: 2013.03.14, 21:27
Откуда: Россия, Иваново
Контактная информация:

Re: Почему после "включения" пользователя происходит автологин?

Сообщение Dominus »

Тут обсуждали похожий вопрос: viewtopic.php?t=7486
Не спорь с дураком, иначе окружающие не правильно поймут кто из вас дурак!
azz
Сообщения: 197
Зарегистрирован: 2016.07.06, 17:20

Re: Почему после "включения" пользователя происходит автологин?

Сообщение azz »

Dominus писал(а): 2017.12.12, 19:00 Тут обсуждали похожий вопрос: viewtopic.php?t=7486
Как всё оказывается непросто. Спасибо, буду изучать.
Ответить