Реализация статуса Read Only

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
unknownby
Сообщения: 749
Зарегистрирован: 2019.11.05, 16:34
Контактная информация:

Re: Реализация статуса Read Only

Сообщение unknownby »

Drugpunker писал(а): 2020.09.09, 15:10
unknownby писал(а): 2020.09.08, 08:43 Если авторизированный может делать еще что-то, а неавторизированный только читать, то делаем блокировку внутри записи пользователя (плюс прописываем для истории в отдельную таблицу users_id, причину блокировки и даты блокировки). При проставлении бана, чтоб разлогинить человека можно как вариант сделать так

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

'on beforeAction' => function ($event) {
        if(!empty(\Yii::$app->user->identity)){
        //проверка на бан
        //если в бане, то Url::toRoute('/user/auth/logout')
        }
    },
Т.е. не важно где пользователь будет находиться, если он залогинен и он оказался в бане, то выкинет сразу. Без удалений сессии.
При логине проверять на активированность учетной записи (да/нет) и выдавать соответствующую информацию пользователю, ну и в бане (да/нет), также выдавать информацию пользователю.

Можно конечно и по другому как-то, наверное :D Подскажут другие люди, которые такое делали в своей системе.
Блин, можешь пояснить.
Чёт не могу я понять как сопоставить identity и конкретного юзера.
Это ж через куки, только для текущего.
То есть админ будет логаутить себя. :)
Сделай чуть по другому тогда, принцип логики в том, чтобы выкинуть пользователя, который ходит по экшенам.
Админ будет ходить и у него срабатывают под него своя проверка, а у забаненного после последующего перехода на страницу, разлогинет и можно заодно передать текст во флэш оповещениях, что он был забанен или отправить на страницу с текстом бана и почему, тут как душе угодно.

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

'on beforeAction' => function ($event) {
        if(!\Yii::$app->user->isGuest)){
        //Прошла проверка на то, что пользователь залогинен
        //проверка на бан
        if(User::findOne(\Yii::$app->user->id)->users_banned){
        	Url::toRoute('/user/auth/logout');
        }
        //поле в БД users_banned буленовское 1 или 0
        //если в бане, то Url::toRoute('/user/auth/logout')
        }
    },
Drugpunker
Сообщения: 187
Зарегистрирован: 2014.08.13, 19:44

Re: Реализация статуса Read Only

Сообщение Drugpunker »

unknownby писал(а): 2020.09.09, 15:23
Drugpunker писал(а): 2020.09.09, 15:10
unknownby писал(а): 2020.09.08, 08:43 Если авторизированный может делать еще что-то, а неавторизированный только читать, то делаем блокировку внутри записи пользователя (плюс прописываем для истории в отдельную таблицу users_id, причину блокировки и даты блокировки). При проставлении бана, чтоб разлогинить человека можно как вариант сделать так

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

'on beforeAction' => function ($event) {
        if(!empty(\Yii::$app->user->identity)){
        //проверка на бан
        //если в бане, то Url::toRoute('/user/auth/logout')
        }
    },
Т.е. не важно где пользователь будет находиться, если он залогинен и он оказался в бане, то выкинет сразу. Без удалений сессии.
При логине проверять на активированность учетной записи (да/нет) и выдавать соответствующую информацию пользователю, ну и в бане (да/нет), также выдавать информацию пользователю.

Можно конечно и по другому как-то, наверное :D Подскажут другие люди, которые такое делали в своей системе.
Блин, можешь пояснить.
Чёт не могу я понять как сопоставить identity и конкретного юзера.
Это ж через куки, только для текущего.
То есть админ будет логаутить себя. :)
Сделай чуть по другому тогда, принцип логики в том, чтобы выкинуть пользователя, который ходит по экшенам.
Админ будет ходить и у него срабатывают под него своя проверка, а у забаненного после последующего перехода на страницу, разлогинет и можно заодно передать текст во флэш оповещениях, что он был забанен или отправить на страницу с текстом бана и почему, тут как душе угодно.

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

'on beforeAction' => function ($event) {
        if(!\Yii::$app->user->isGuest)){
        //Прошла проверка на то, что пользователь залогинен
        //проверка на бан
        if(User::findOne(\Yii::$app->user->id)->users_banned){
        	Url::toRoute('/user/auth/logout');
        }
        //поле в БД users_banned буленовское 1 или 0
        //если в бане, то Url::toRoute('/user/auth/logout')
        }
    },
Но это ж во все контроллеры пихать придётся.
Нужно что-то "тоньше" придумать.
Я тут про хранение сессий сейчас читаю.
Мож просто auth_key снести.
Или как-то найти какой-нибудь session id, и его затереть :?

Такое вот интересное решение нарыл на просторах:
1) Add a "last_session_id" field to your user table.
2) Add following to your main controller:

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

public function afterAction($action, $result)
{
       $result = parent::afterAction($action, $result);

       if(Yii::$app->user->id)
       {
           //update the user table with last_session_id
           $user = User::find()->where(['id' => Yii::$app->user->id])->one();
           $user->last_session_id = Yii::$app->session->id;
           $user->save(false);
       }

       return $result;
}
3) Change site/login action to following:

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

public function actionLogin()
{
       if (!\Yii::$app->user->isGuest) {
           return $this->goHome();
       }

       $model = new LoginForm();
       if ($model->load(Yii::$app->request->post()) && $model->login()) {

           //delete previous session ID and change auth key
           Yii::$app->session->destroySession(Yii::$app->user->identity->last_session_id);
           $u = \common\models\User::find()->where(['id' => Yii::$app->user->id])->one();
           $u->auth_key = Yii::$app->security->generateRandomString();
           $u->save(false);
           return $this->goBack();
       } else {
           return $this->render('/site/login', [
               'model' => $model,
           ]);
       }
}
Неужели из коробки нет готового решения...
Последний раз редактировалось Drugpunker 2020.09.09, 15:44, всего редактировалось 1 раз.
unknownby
Сообщения: 749
Зарегистрирован: 2019.11.05, 16:34
Контактная информация:

Re: Реализация статуса Read Only

Сообщение unknownby »

Drugpunker писал(а): 2020.09.09, 15:39 Но это ж во все контроллеры пихать придётся.
Нужно что-то "тоньше" придумать.
Я тут про хранение сессий сейчас читаю.
Мож просто auth_key снести.
Или как-то найти какой-нибудь session id, и его затереть :?
Я ведь сказал, что это нужно засунуть в конфиг и тогда это действие будет относиться ко всем контроллерам одновременно :D
После определения модулей и компонентов
Drugpunker
Сообщения: 187
Зарегистрирован: 2014.08.13, 19:44

Re: Реализация статуса Read Only

Сообщение Drugpunker »

unknownby писал(а): 2020.09.09, 15:44
Drugpunker писал(а): 2020.09.09, 15:39 Но это ж во все контроллеры пихать придётся.
Нужно что-то "тоньше" придумать.
Я тут про хранение сессий сейчас читаю.
Мож просто auth_key снести.
Или как-то найти какой-нибудь session id, и его затереть :?
Я ведь сказал, что это нужно засунуть в конфиг и тогда это действие будет относиться ко всем контроллерам одновременно :D
После определения модулей и компонентов
Упустил похоже :)
Побежал смотреть...
unknownby
Сообщения: 749
Зарегистрирован: 2019.11.05, 16:34
Контактная информация:

Re: Реализация статуса Read Only

Сообщение unknownby »

Drugpunker писал(а): 2020.09.09, 15:48 Упустил похоже :)
Побежал смотреть...
И дату можно дополнительно проверять со связкой забанен ли :)
Дата и время (забанен до) и меньше текущей даты и времени

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

'on beforeAction' => function ($event) {
        if(!\Yii::$app->user->isGuest)){
        //Прошла проверка на то, что пользователь залогинен
        //проверка на бан
        	$user = User::findOne(\Yii::$app->user->id);
        	if($user->users_banned && ($user->users_banned_date_to > date("Y-m-d H:i:s"))){
        		Url::toRoute('/user/auth/logout');
        	}
        //поле в БД users_banned буленовское 1 или 0
        //если в бане, то Url::toRoute('/user/auth/logout')
        }
    },
P.S. изначально не в ту сторону поставил равенство в дате бана, надо чтобы дата бана была больше текущей даты, тогда он в бане.
deckrdshaw
Сообщения: 1
Зарегистрирован: 2020.09.22, 20:11

Re: Реализация статуса Read Only

Сообщение deckrdshaw »

Разблокирование - также при логине.
непонятный момент.
Кто блокировал? Админ. Ну он пусть и разблокирует.

-- Прошу совета, как кто прорабатывает сию концепцию?
да почти все, у кого есть пользователи на сайте

и для валидации почты все готово. в штатной таблице типовых шаблонов Yii даже поле есть для токена.
Один только нюанс
ответить пользователю при логине что он забанен
Get detaits about az visa for pakistani citizens Requirements and Fee.
unknownby
Сообщения: 749
Зарегистрирован: 2019.11.05, 16:34
Контактная информация:

Re: Реализация статуса Read Only

Сообщение unknownby »

deckrdshaw писал(а): 2020.09.22, 20:17 Разблокирование - также при логине.
непонятный момент.
Кто блокировал? Админ. Ну он пусть и разблокирует.

-- Прошу совета, как кто прорабатывает сию концепцию?
да почти все, у кого есть пользователи на сайте

и для валидации почты все готово. в штатной таблице типовых шаблонов Yii даже поле есть для токена.
Один только нюанс
ответить пользователю при логине что он забанен
Зачем разблокировать? Указывается дата блокировки, т.е. по указанную дату, человека будет переадресовывать на страницу "Вы забанены до ... по причине ...".
А переадресацию делать по условию, если еще забанен, переадресовать, если нет, то ничего не делать и он просто логинится нормально. :)
Ответить