2017-07-02 100 views
0

我想在管理頁面的laravel 5.4中創建第二個身份驗證。laravel 5.4,添加第二個身份驗證(管理面板)


,首先讓我介紹我的問題: 我必須通過Web網頁6後衛一個有功能的用戶登錄(默認laravel AUTH)。現在我想爲管理面板創建第二個身份驗證。我有另一個存儲名稱的表,一個令牌(類似於密碼)和一個權限級別。

第二個/獨立表是由系統給出的頁面開發的依賴關係,所以我不能改變它。

我有管理面板的登錄頁面,但是當我嘗試進行身份驗證時,我每次都重定向回登錄。


我已經一派整個事情,遇到了一些很好的例子來:

  1. https://jamesmcfadden.co.uk/custom-authentication-in-laravel-with-guards-and-user-service-providers

    • 等各個環節都在引擎收錄控制器膏(以下鏈接下)

但我無法弄清楚。


這裏就是我所做的已經:

  • 增加了第二個後衛命名爲 '管理' 在配置/ auth.php

    'guards' => [ 
        'web' => [ 
         'driver' => 'session', 
         'provider' => 'users', 
        ], 
    
        'admin' => [ 
         'driver' => 'session', 
         'provider' => 'admin', 
        ] 
    ], 
    
    'providers' => [ 
        'users' => [ 
         'driver' => 'eloquent', 
         'model' => App\User::class, 
        ], 
    
        'admin' => [ 
         'driver' => 'eloquent', 
         'model' => App\Admin::class, 
        ] 
    ], 
    
  • 添加了所需的模式

    namespace App; 
    
    use Illuminate\Notifications\Notifiable; 
    use Illuminate\Foundation\Auth\User as Authenticatable; 
    
    class Admin extends Authenticatable 
    { 
        use Notifiable; 
    
        protected $fillable = [ 
         'mID', 
         'mAccount', 
         'mName', 
         'mServerIP', 
         'mAuthority', 
         'mToken' 
        ]; 
    
        protected $hidden = [ 
         'mContactIP', 'mToken' 
        ]; 
    
        protected $table = 'administration'; 
        protected $connection = 'common'; 
    
        public $timestamps = false; 
    
        public function getAuthIdentifierName() 
        { 
         return 'mAccount'; 
        } 
    } 
    
  • 添加必要路線路線/ web.php

    Route::group(['prefix' => 'admin'], function() { 
        Route::get('/login','Auth\[email protected]')->middleware('web'); 
        Route::post('/login','Auth\[email protected]'); 
        Route::get('/logout','Auth\[email protected]'); 
    
        Route::get('/', function(){return redirect('admin/dashboard');}); 
        Route::get('/dashboard', '[email protected]'); 
    
    }); 
    
  • 增添了新的中間件應用程序/ HTTP /中間件命名爲「RedirectIfElevated'通過命令'PHP人員化妝:中間件'

    public function handle($request, Closure $next, $guard = 'admin') 
    { 
        if (!Auth::guard($guard)->check()) 
        { 
         if(!Auth::guard('web')->check()) 
         { 
          return redirect('/'); 
         } 
    
         return redirect('/admin/login'); 
        } 
    
        return $next($request); 
    } 
    
  • 內核。PHP

    protected $routeMiddleware = [ 
        . 
        . 
        . 
        'admin' => \WarShape\Http\Middleware\RedirectIfElevated::class, 
    ]; 
    
  • 最後我創造了我控制器https://pastebin.com/s6iJgFAB

  • ,並建立了視圖

    @extends('layouts.app') 
    
    @section('content') 
    <div class="container"> 
        <div class="row"> 
         <div class="col-md-8 col-md-offset-2"> 
          <div class="panel panel-default"> 
           <div class="panel-heading">Elevation</div> 
           <div class="panel-body"> 
            <form class="form-horizontal" role="form" method="POST" action="{{ url('/admin/login') }}"> 
             {{ csrf_field() }} 
    
             <div class="form-group{{ $errors->has('password') ? ' has-error' : '' }}"> 
              <label for="mToken" class="col-md-4 control-label">Token</label> 
    
              <div class="col-md-6"> 
               <input id="mToken" type="password" class="form-control" name="mToken" required> 
    
               @if ($errors->has('password')) 
                <span class="help-block"> 
                <strong>{{ $errors->first('password') }}</strong> 
               </span> 
               @endif 
              </div> 
             </div> 
    
             <div class="form-group{{ $errors->has('g-recaptcha-response') ? ' has-error' : '' }}"> 
              <label for="recaptcha" class="col-md-4 control-label">Solve Captcha <br> & Elevate!</label> 
    
              <div class="col-md-6"> 
               {!! app('captcha')->display($attributes = [], $lang = app()->getLocale()) !!} 
    
               @if ($errors->has('g-recaptcha-response')) 
                <span class="help-block"> 
                <strong>{{ $errors->first('g-recaptcha-response') }}</strong> 
               </span> 
               @endif 
              </div> 
             </div> 
    
             <input type="hidden" name="mAccount" value="{{ Auth::guard('web')->user()->login }}"> 
    
             <div class="form-group"> 
              <div class="col-md-8 col-md-offset-4"> 
               <button type="submit" class="btn btn-primary"> 
                Elevate 
               </button> 
              </div> 
             </div> 
            </form> 
           </div> 
          </div> 
         </div> 
        </div> 
    </div> 
    @endsection 
    

所以我需要一個答案的問題是:

  1. 如果我錯過了什麼?我在哪裏搞砸了?

我希望你能幫助我解決這個&感謝您的幫助!

回答

1

我固定的,與下面的自定義登錄方法:

public function elevate(Request $request) 
{ 
    // login 
    $this->validateLogin($request); 
    $admin = Admin::where('mAccount', '=', Auth::guard('web')->user()->login) 
     ->where('mToken', '=', $request->input('mToken'))->first(); 
    if($admin){ 
     Auth::guard('admin')->login($admin); 
     return redirect('/admin/dashboard'); 
    } 
    else{ 
     throw new \ErrorException('Elevation failed!'); 
    } 
} 

protected function validateLogin(Request $request) 
{ 
    $this->validate($request, [ 
     'mToken' => 'required|string|min:8', 
     'g-recaptcha-response' => 'required|captcha' 
    ]); 
} 
1

對不起,如果我沒有回答你的問題,但不能在你的用戶表中添加一個簡單的列,如is_admin,並且只允許用戶在is_admin = 1的地方訪問管理面板,而不是使用中間件登錄兩次?

+0

這是最常見的方式,當談到這一點。我在網上多次看到它。但是我必須使用第二個表,因爲它存儲了我無法更改的另一個應用程序的必要數據。我也想過編寫自己的登錄類,但即使如此,我也不知道如何將數據庫中的數據傳遞給auth guard/session。對此有何建議? – PolluX