Laravel 5.3 Блокировка пользователя авторизации

У меня есть вопрос, в настоящее время я разрабатываю небольшой сайт с Laravel 5.3, и я использую базовую аутентификацию от них, чтобы пользователи могли регистрироваться и входить в систему.

Теперь я хочу следующее: Все могут зарегистрироваться и войти, но если я нажму на кнопку (как админ), я могу "заблокировать" одного конкретного пользователя (например, если он сделал что-то не разрешенное), я не удаляю полностью строку в базе данных, но каким-то образом убедитесь, что если пользователь попытается войти в систему, он получит сообщение, в котором говорится что-то вроде «вы больше не можете войти в систему, ваша учетная запись заблокирована, свяжитесь с администратором для получения дополнительной информации» или что-то подобное. Вопрос: как лучше всего это сделать? Я не нашел чего-то встроенного, поправьте меня, если я ошибаюсь... Конечно, я мог бы просто изменить таблицу пользователей и добавить столбец с именем «заблокировано», обычно для него установлено значение false, а затем с помощью кнопки установите для него значение true, а затем при входе в систему как-то проверяет это значение и (если это правда) показывает это сообщение и не позволяет войти в систему. Это лучший способ сделать это? Если да, то где я должен проверить это значение и как тогда показать сообщение? Если нет, то как лучше?


person nameless    schedule 16.11.2016    source источник


Ответы (5)


Я бы сделал то, что вы предлагаете - используйте столбец blocked или active, чтобы указать, должен ли пользователь иметь возможность войти в систему. Когда я делал что-то подобное в прошлом, чтобы проверить это значение при входе в систему, я переместил готовую функцию входа в мой LoginController и немного добавил к ней. Мой метод входа теперь выглядит так:

/**
 * Handle a login request to the application.
 *
 * @param  \Illuminate\Http\Request  $request
 * @return \Illuminate\Http\Response
 */
public function login(Request $request)
{
    $this->validateLogin($request);

    $user = User::where('email', $request->email)->firstOrFail();
    if ( $user && !$user->active ) {
        return $this->sendLockedAccountResponse($request);
    }

    if ($this->hasTooManyLoginAttempts($request)) {
        $this->fireLockoutEvent($request);

        return $this->sendLockoutResponse($request);
    }

    if ($this->attemptLogin($request)) {
        return $this->sendLoginResponse($request);
    }

    $this->incrementLoginAttempts($request);

    return $this->sendFailedLoginResponse($request);
}

Я также добавил эти функции для обработки неактивных пользователей:

/**
 * Get the locked account response instance.
 *
 * @param \Illuminate\Http\Request  $request
 * @return \Illuminate\Http\Response
 */
protected function sendLockedAccountResponse(Request $request)
{
    return redirect()->back()
        ->withInput($request->only($this->loginUsername(), 'remember'))
        ->withErrors([
            $this->loginUsername() => $this->getLockedAccountMessage(),
        ]);
}

/**
 * Get the locked account message.
 *
 * @return string
 */
protected function getLockedAccountMessage()
{
    return Lang::has('auth.locked')
            ? Lang::get('auth.locked')
            : 'Your account is inactive. Please contact the Support Desk for help.';
}
person jackel414    schedule 16.11.2016
comment
Спасибо за ответ. То, что вы опубликовали, выглядит хорошо, но как я могу переместить стандартную функцию входа в систему в свой собственный контроллер, чтобы вместо этого она использовала то, что я rpvoide? - person nameless; 16.11.2016
comment
AuthController наследует метод входа в систему от Illuminate\Foundation\Auth\AuthenticatesUsers. Если вы скопируете метод входа из этого класса в свой AuthController, Laravel вместо этого будет использовать версию AuthController. Таким образом, вы можете изменить его в соответствии с вашими потребностями. (это для Laravel 5.2, но я считаю, что эти имена классов одинаковы в 5.3) - person jackel414; 16.11.2016
comment
но что такое AuthController? Просто новый контроллер я создаю? Когда это называется? Извините, я немного запутался - person nameless; 16.11.2016
comment
Правильно - извините, в 5.3 поменяли название контроллера. Если вы используете каркас аутентификации laravel, вы должны добавить метод входа в LoginController (App\Http\Controllers\Auth\LoginController). - person jackel414; 16.11.2016
comment
Итак, что я делаю, так это копирую функцию login из AuthenticateUsers, перезаписываю ее в LoginController, добавляя предоставленное вами условие if, а также добавляя два метода (sendLockedAccountResponse и getLockedAccountMessage, правильно? Прежде чем сделать это, я проверяю, есть ли кнопка, которая устанавливает столбец locked в db на true, это то, что вы имеете в виду? - person nameless; 16.11.2016
comment
В моем примере новый столбец называется active (и когда это false, этот пользователь не может войти в систему), но все остальное правильно. Я обновил свой ответ полным методом входа в систему, чтобы, надеюсь, сделать его немного более понятным. - person jackel414; 16.11.2016

Вы можете использовать функцию обратимого удаления.

В дополнение к фактическому удалению записей из вашей базы данных, Eloquent также может «мягко удалять» модели. При обратимом удалении моделей они фактически не удаляются из вашей базы данных. Вместо этого в модели устанавливается атрибут delete_at, который вставляется в базу данных. Если модель имеет ненулевое значение remote_at, модель была обратимо удалена.

person Alexey Mezenin    schedule 16.11.2016
comment
На самом деле будет то же самое, что я сказал, но только с атрибутом deleted_at вместо столбца с именем blocked. Также я могу полностью удалить что-то в БД, так что это не то, что я хочу, я думаю - person nameless; 16.11.2016
comment
Мягкое удаление @nameless — это именно то, что вам нужно. В нем уже есть все необходимые методы, такие как forceDelete(), withTrashed(), trashed(), restore() и т. д. Он также автоматически скрывает «заблокированных» пользователей от обычных запросов get(), paginate() и т. д. - person Alexey Mezenin; 16.11.2016
comment
но если активировано мягкое удаление, могу ли я полностью удалить пользователей, если захочу? И как я мог тогда (если пользователь был мягко удален) проверить его при входе в систему, чтобы показать сообщение? - person nameless; 16.11.2016
comment
Чтобы полностью удалить пользователя, используйте forceDelete() - person Alexey Mezenin; 16.11.2016
comment
To permanently remove a soft deleted model from the database, use the forceDelete method: должен ли я сначала удалить его, а затем использовать forceDelete()?also still don't no how I can, when a user logs in, check if this account is soft deleted and if yes print this message (actually print it instead of the эта запись не была найдена в сообщении базы данных) - person nameless; 16.11.2016
comment
В моем случае я перепробовал так много способов выхода пользователя из системы, создав промежуточное ПО, такое как BlockedUser, и применив это промежуточное ПО к моему мультиаутентификации. но не повезло, и это soft deleting идеальное решение для меня. спасибо @AlexeyMezenin - person arun; 24.03.2018

шаг 1:

add new field to the User table called ‘status’ (1:enabled, 0:disabed)

шаг 2:

to block the web login , in app/Http/Controllers/Auth/LoginController.php add the follwoing function:

/**
 * Get the needed authorization credentials from the request.
 *
 * @param \Illuminate\Http\Request $request
 * @return array
 */
 protected function credentials(\Illuminate\Http\Request $request)
 {
 $credentials = $request->only($this->username(), ‘password’);

return array_add($credentials, ‘status’, ‘1’);
 }

Шаг 3:

to block the user when using passport authentication ( token ) , in the User.php model add the following function :

public function findForPassport($identifier) {
     return User::orWhere(‘email’, $identifier)->where(‘status’, 1)->first();
     }

обратитесь к этой ссылке (учебник) поможет вам: https://medium.com/@mshanak/solved-tutorial-laravel-5-3-disable-enable-block-user-login-web-passport-oauth-4bfb74b0c810

person Mahdi    schedule 09.01.2017

Есть пакет, который не только блокирует пользователей, но и позволяет следить за ними, прежде чем принимать решение блокировать их или нет.

Наблюдение Laravel: https://github.com/neelkanthk/laravel-surveillance< /а>

person Neelkanth Kaushik    schedule 01.11.2020

Решено: эта ссылка (руководство) поможет вам: https://medium.com/@mshanak/solved-tutorial-laravel-5-3-disable-enable-block-user-login-web-passport-oauth-4bfb74b0c810

шаг 1:

add new field to the User table called ‘status’ (1:enabled, 0:disabed)

шаг 2:

to block the web login , in app/Http/Controllers/Auth/LoginController.php add the follwoing function:

/**
 * Get the needed authorization credentials from the request.
 *
 * @param \Illuminate\Http\Request $request
 * @return array
 */
 protected function credentials(\Illuminate\Http\Request $request)
 {
 $credentials = $request->only($this->username(), ‘password’);

return array_add($credentials, ‘status’, ‘1’);
 }

Шаг 3:

to block the user when using passport authentication ( token ) , in the User.php model add the following function :

public function findForPassport($identifier) {
     return User::orWhere(‘email’, $identifier)->where(‘status’, 1)->first();
     }

Сделанный :)

person Mahdi    schedule 09.01.2017
comment
Ссылка на потенциальное решение всегда приветствуется, но, пожалуйста, добавьте контекст вокруг ссылки, чтобы ваши коллеги-пользователи имели некоторое представление о том, что это и почему это там. Всегда цитируйте наиболее релевантную часть важной ссылки на случай, если целевой сайт недоступен или навсегда отключится. Учтите, что возможная причина того, что почему и как удаляются некоторые ответы, — это не более чем ссылка на внешний сайт?. - person FelixSFD; 09.01.2017