2017-02-22 103 views
1

我使用Laravel 5.4及其內置的Auth API。我在users表中添加了一個名爲is_admin的列。我想修改登錄過程,以便登錄僅在is_admin == 1時有效。我查看了Illuminate\Foundation\Auth\AuthenticatesUsers.phpGithub),我可能會在那裏做一些改變,但如果可能的話,我寧願不打擾核心。有沒有更優雅的方式來做到這一點?Laravel auth在登錄之前檢查列

+0

覆蓋實現AuthenitacesUsers的類中的函數。 – devk

+0

你可以爲此做一箇中間件? –

回答

0

我解決這與類似@Sagar的解決方案阿羅拉的。在運行artisan make:auth時創建的app\Http\Controllers\Auth\LoginController.php中,我忽略了AuthenticatesUsers中的attemptLogin方法。這是代碼在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'後衛,那麼假設使用相同的'session'驅動程序,則需要創建整個'admins'表和模型。我認爲將用戶保存在一張表中是一種很好的做法,因此隨着應用程序的增長,您只需添加權限/角色。所以是使用警衛是一種解決方案。但在這種情況下,我會說這是相當大膽,然後優雅。 –

+0

@GluePear我還會補充一點,有時候有幾個用戶表也可以。例如,當你讓後臺站點只能用於管理員時。但認爲它仍然可以在一張桌子內完成。聽到其他方法會很高興 –

0

就像你提到的,你永遠不應該觸及核心文件。但是如果你能看到laravel已經在LoginController上添加了AuthenticatesUsers作爲trait這意味着你可以簡單地通過覆蓋它在LoginController中加入credentials()就像下面這樣。

/** 
* 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

有趣。我不知道這是否比我的回答更好(在LoginController中重寫'attemptLogin')。 – 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 

也請記住,你應該禁用寄存器功能,因爲註冊用戶仍登錄後。