2017-07-02 181 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