2

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

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

ответ

2

Я хотел бы сделать то, что вы предлагаете. - использовать 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.'; 
} 
+0

Спасибо за ответ. Выглядит, что вы опубликовали, но как я могу переместить функцию входа в систему в свой собственный контроллер, чтобы вместо этого использовать то, что я вместо rpvoide? – nameless

+0

AuthController наследует метод входа в систему из 'Illuminate \ Foundation \ Auth \ AuthenticatesUsers'. Если вы скопируете метод входа из этого класса в свой AuthController, Laravel вместо этого будет использовать версию AuthController. Таким образом, вы можете изменить его в соответствии с вашими потребностями. (это для Laravel 5.2, но я считаю, что эти имена классов одинаковы в 5.3) – jackel414

+0

, но что такое AuthController? Просто новый контроллер, который я создаю? Когда это называется? Извините, я немного смущен – nameless

0

Вы можете использовать функцию soft deleting.

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

+1

бы быть на самом деле то же самое я сказал, но только с 'deleted_at' атрибут вместо столбца с именем' blocked' .. Кроме того, Возможно, я хочу полностью удалить что-то в db, так что это не то, что я хочу. Я думаю, что – nameless

+0

@nameless soft delete - именно то, что вы ищете. Он уже имеет все необходимые методы, такие как 'forceDelete()', 'withTrashed()', 'trashed()', 'restore()' и т. Д. Он также автоматически скрывает «заблокированных» пользователей от обычных 'get()', 'paginate() 'etc. –

+0

но с включенным мягким удалением, могу ли я полностью удалить пользователей, если захочу? И как я мог тогда (если пользователь был мягко удален) проверить его при регистрации в сообщении? – nameless

-2

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

step1:

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

step2:

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(); 
    } 

Готово :)

+0

Ссылка на потенциальное решение всегда приветствуется, но, пожалуйста, [добавьте контекст вокруг ссылки] (http://meta.exetchange.com/a/8259), чтобы ваши друзья-пользователи имели представление о том, что это такое и почему оно есть , Всегда указывайте наиболее значимую часть важной ссылки, если целевой сайт недоступен или постоянно находится в автономном режиме. Учтите, что это всего лишь ссылка на внешний сайт - это возможная причина [Почему и как удаляются некоторые ответы?] (Http://stackoverflow.com/help/deleted-answers). – FelixSFD

0

шаг1:

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

step2:

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’); 
} 

Step3:

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

Смежные вопросы