2017-02-22 29 views
1

Я использую Laravel 5.4 и его встроенный API Auth. Я добавил столбец в таблицу users под названием is_admin. Я хочу изменить процесс входа в систему, чтобы логин работал только в том случае, если is_admin == 1. Я посмотрел в Illuminate\Foundation\Auth\AuthenticatesUsers.php (Github), и я, вероятно, мог бы внести изменения там, но я бы предпочел не беспокоить ядро, если это возможно. Есть ли более элегантный способ сделать это?Laravel auth для проверки столбца перед входом в систему

+0

Переопределите функцию в своем классе, которая реализует AuthenitacesUsers. – devk

+0

Возможно, вы могли бы создать промежуточное ПО для этого? –

ответ

0

Я решаемой это с решением, аналогичным @Sagar Arora годов. В app\Http\Controllers\Auth\LoginController.php, который создается при запуске artisan make:auth, я переопределил метод attemptLogin от AuthenticatesUsers. Это код в LoginController.php:

protected function attemptLogin(Request $request) 
{ 
    return (auth()->attempt(['email' => $request->email, 'password' => $request->password, 'is_admin' => 1])); 
} 

Сейчас только пользователи с is_admin == 1 будут регистрироваться в

0

Вы можете создать функцию входа, как:

Таким образом, в вашей функции входа вы можете проверить это:

if (Auth::attempt(['email' => $email, 'password' => $password, 'is_admin' => 1])) { 
    // The user is active, not suspended, and exists. 
} 

Вы проверяете здесь ручной процесс входа в систему с дополнительными полями:

https://laravel.com/docs/5.4/authentication#authenticating-users Спасибо

0

Я думаю, что лучший способ - фактически разрешить всем пользователям входить в систему. А затем ограничьте доступ через промежуточное ПО admin. Таким образом, вы можете применить это промежуточное программное обеспечение к максимально возможному количеству маршрутов.

Используйте его оберточными необходимые маршруты в

Route::group(['middleware' => 'admin'], function() { 
    // auth protected routes 
}); 

Таким образом, вы создаете app\Http\Middleware\RedirectIfNotAdmin:

<?php 

namespace App\Http\Middleware; 

use Closure; 

class RedirectIfNotAdmin 
{ 
    /** 
    * Handle an incoming request. 
    * 
    * @param \Illuminate\Http\Request $request 
    * @param \Closure $next 
    * @return mixed 
    */ 
    public function handle($request, Closure $next) 
    { 
     $user = $request->user(); 

     if ($user && $user->is_admin) { 
      return $next($request); 
     } 

     return redirect('/'); 
    } 
} 

Затем в app\Http\Kernel.php вы добавить его в $routeMiddleware собственности:

protected $routeMiddleware = [ 
     // ... other middlewares 
     'admin' => \App\Http\Middleware\RedirectIfNotAdmin::class 
    ]; 
+0

Спасибо. Вы говорите, что думаете, что это лучше - почему (просто любопытно)? Я имею в виду, почему бы не создать, например, нового охранника под названием «admin». – GluePear

+0

@GluePear Хорошо, да, охранник также может решить эту проблему. Но если использовать 'admin' guard, то, предполагая использование одного и того же драйвера' session', вам нужно будет создать целую таблицу и модель admins. Я считаю, что сохранение пользователей в одной таблице является хорошей практикой, так что по мере роста вашего приложения вы просто добавляете разрешения/роли. Так что да, использование защиты - это решение. Но в этом случае я бы сказал, что он довольно смелый, но элегантный. –

+0

@GluePear Ну, я бы также добавил, что иногда наличие нескольких таблиц пользователей тоже в порядке. Например, если вы разрешили использовать сайт backoffice, доступный только для администраторов. Но думать, что это все еще можно сделать за одним столом. Было бы неплохо услышать другие подходы –

0

Так же, как вы упомянули, вы никогда не должны касаться основного файла.. Но если бы вы могли видеть, что laravel добавила AuthenticatesUsers как trait на LoginController, это означает, что вы можете просто переопределить, добавив credentials() в LoginController, как показано ниже.

/** 
* Get the needed authorization credentials from the request. 
* 
* @param \Illuminate\Http\Request $request 
* @return array 
*/ 
protected function credentials(Request $request) 
{ 
    return [ 
     'email' => $request->input('email'), 
     'password' => $request->input('password'), 
     'is_admin' => 1 
    ]; 
} 
+0

Интересно. Интересно, предпочитает ли это мой ответ (переопределяя 'tryLogin' в' LoginController'). – GluePear

0

Это решение может быть не изящным, но все еще работающим.

Добавьте к этому LoginController:

protected function authenticated(Request $request, $user) 
{ 
    if (! $user->is_admin) { 
     Auth::logout(); 
     return redirect('login')->withErrors(['is_admin' => 'Only admin users may log in']); 
    } 
} 

Затем поместите это в auth/login.blade.php:

@if($errors->has('is_admin')) 
    <div class="alert alert-danger" role="alert">{{ $errors->first('is_admin') }}</div> 
@endif 

Также имейте в виду, что вы должны отключить функции регистра, потому что после регистрации пользователя до сих пор входит в систему.