Я новичок в Laravel, но влюбился в рамки и решил использовать его для своего проекта.
У меня поле active
и по умолчанию я установил его в 0
. В методе Attempt()
я установил $credentials['active'] = 1
. Когда я выхожу из системы и снова вхожу в систему, это работает нормально.
Но когда я регистрирую пользователя, он автоматически регистрирует пользователя без проверки активного поля.
Я предполагаю, что вы используете свойство AuthenticatesAndRegistersUsers
в своем контроллере.
Регистрация осуществляется методом postRegister()
в этом признаке, который вызывает метод login()
после создания нового пользователя.
Вы можете переопределить этот метод в своем контроллере и вызвать метод login()
только тогда, когда active
полем является true
. Таким образом, ваш postRegister()
будет выглядеть примерно так:
public function postRegister(Request $request) { $validator = $this->registrar->validator($request->all()); if ($validator->fails()) { $this->throwValidationException( $request, $validator ); } $user = $this->registrar->create($request->all()); if ($request->get('active')) { $this->auth->login($user); } return redirect($this->redirectPath()); }
В registersUsers.php замените строку:
Auth::guard($this->getGuard())->login($this->create($request->all()));
Со следующим:
$this->create($request->all());
Это сработало для меня, я использую Laravel 5.2
Я бы не добавил добавление active
поля к учетным данным – это проблема авторизации, а не аутентификация.
Для этого я использовал бы промежуточное программное обеспечение, чтобы проверить, активен ли вход в систему или неактивен. В 5.3 промежуточное ПО будет выглядеть так:
<?php namespace App\Http\Middleware; use Closure; use Illuminate\Support\Facades\Auth; class RedirectIfInactive { /** * Handle an incoming request. * * @param \Illuminate\Http\Request $request * @param \Closure $next * @return mixed */ public function handle($request, Closure $next) { if ( $user = Auth::guard('web')->user() ) { if ( ! $user->active ) return redirect(route('account_inactive')); } return $next($request); } }
Затем это промежуточное программное обеспечение должно быть зарегистрировано внутри Kernel.php
:
protected $routeMiddleware = [ 'auth' => \Illuminate\Auth\Middleware\Authenticate::class, 'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class, 'bindings' => \Illuminate\Routing\Middleware\SubstituteBindings::class, 'can' => \Illuminate\Auth\Middleware\Authorize::class, 'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class, 'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class, 'inactive' => \App\Http\Middleware\RedirectIfInactive::class, ];
И, наконец, мы защищаем все наши маршруты:
Route::get('inactive', ['as' => 'account_inactive', function () { return view('inactive'); }]); Route::group(['prefix' => 'admin', 'namespace' => 'Admin', 'middleware' => 'inactive'], function () { Route::get('/', ['as' => 'admin.home', 'uses' => 'AdminController@index']); });
Преимущество этого подхода состоит в том, что мы можем отобразить более релевантное сообщение об ошибке, чем общее «Эти учетные данные не соответствуют нашим записям», которые получают люди с плохими данными. Таким образом, пользователь знал бы, что это не их вина, они не могут войти в систему.
В любом случае, с подходом в принятом ответе, убедитесь, что вы сделали то же самое, когда пользователь успешно сбрасывает свой пароль, поскольку он также автоматически записывается в систему.