Laravel 5.5 不同用戶表登錄認證(前后臺分離)

來自(https://www.cnblogs.com/hypnot/p/8352582.html);

Auth 認證原理簡述
Laravel 的認證是使用guard與provider配合完成辟躏,guard負責認證的業(yè)務(wù)邏輯谷扣,認證信息的服務(wù)端保存等;provider負責提供認證信息的持久化數(shù)據(jù)提供捎琐。

請求提交給guard会涎,guard從provider里取出數(shù)據(jù)(類似用戶名、密碼等)瑞凑,驗證輸入數(shù)據(jù)與服務(wù)器端存儲的數(shù)據(jù)是否吻合末秃。如果提交的數(shù)據(jù)正確,再做 session 等業(yè)務(wù)的處理(如有需要)籽御。
認證腳手架
首先我們導(dǎo)入 Laravel 的自帶的認證腳手架

php artisan make:auth

執(zhí)行數(shù)據(jù)庫遷移:

php artisan migrate

修改 Auth 認證的配置文件config/auth.php
在 gurads 處练慕,添加adminguard 用于后臺管理員認證

'guards' => [
        'web' => [
            'driver' => 'session',
            'provider' => 'users',
        ],

        'admin' => [
            'driver' => 'session',
            'provider' => 'admins',
        ],

        'api' => [
            'driver' => 'token',
            'provider' => 'users',
        ],
    ],

在 providers 處添加 admins provider惰匙,使用 Admin 模型

'providers' => [
        'users' => [
            'driver' => 'eloquent',
            'model' => App\User::class,
        ],

        'admins' => [
            'driver' => 'eloquent',
            'model' => App\Admin::class,
        ],
    ],

創(chuàng)建后臺管理員模型
我們再創(chuàng)建一個 Admin 模型,用于后臺管理員登錄驗證铃将。

 php artisan make:model Admin -m

-m 參數(shù)會同時生成數(shù)據(jù)庫遷移文件 xxxx_create_admins_table
修改 app/Admin.php 模型文件

<?php

namespace App;

use Illuminate\Notifications\Notifiable;
use Illuminate\Foundation\Auth\User as Authenticatable;

class Admin extends Authenticatable
{
    use Notifiable;

    /**
     * The attributes that are mass assignable.
     *
     * @var array
     */
    protected $fillable = [
        'name', 'password',
    ];

    /**
     * The attributes that should be hidden for arrays.
     *
     * @var array
     */
    protected $hidden = [
        'password', 'remember_token',
    ];
}

編輯 xxxx_create_admins_table 文件项鬼,后臺管理員模型結(jié)構(gòu)與前臺用戶差不多,去掉 email 字段劲阎,name 字段設(shè)為 unique

<?php

use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

class CreateAdminsTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('admins', function (Blueprint $table) {
            $table->increments('id');
            $table->string('name')->unique();
            $table->string('password');
            $table->rememberToken();
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('admins');
    }
}

管理員模型填充數(shù)據(jù)
定義一個數(shù)據(jù)模型工廠绘盟,在 database/factories/ModelFactory.php 中添加如下代碼

$factory->define(App\Admin::class, function (Faker\Generator $faker) {
    static $password;

    return [
        'name' => $faker->firstName,
        'password' => $password ?: $password = bcrypt('secret'),
        'remember_token' => str_random(10),
    ];
});

使用 Faker 隨機填充用戶名
在 database/seeds 目錄下生成 AdminsTableSeeder.php 文件。

php artisan make:seeder AdminsTableSeeder

編輯 database/seeds/AdminsTableSeeder.php 文件的 run 方法悯仙,添加3個管理員用戶龄毡,密碼為 123456

 public function run()
     {
         factory('App\Admin', 3)->create([
             'password' => bcrypt('123456')
            ]);
     }

database/seeds/DatabaseSeeder.phprun 方法里調(diào)用 AdminsTableSeeder

 public function run()
     {
         $this->call(AdminsTableSeeder::class);
     }

執(zhí)行數(shù)據(jù)庫遷移命令

 php artisan migrate --seed

數(shù)據(jù)庫里會創(chuàng)建 admins 表,并且生成了3條數(shù)據(jù)

創(chuàng)建后臺頁面

創(chuàng)建控制器

php artisan make:controller Admin/LoginController    
php artisan make:controller Admin/IndexController

其中锡垄, Admin/LoginController 負責登錄邏輯沦零; Admin/IndexController 管理登錄后的首頁。
編輯 Admin/LoginController.php

<?php

namespace App\Http\Controllers\Admin;

use App\Http\Controllers\Controller;
use Illuminate\Foundation\Auth\AuthenticatesUsers;

class LoginController extends Controller
{
    /*
    |--------------------------------------------------------------------------
    | Login Controller
    |--------------------------------------------------------------------------
    |
    | This controller handles authenticating users for the application and
    | redirecting them to your home screen. The controller uses a trait
    | to conveniently provide its functionality to your applications.
    |
    */

    use AuthenticatesUsers;

    /**
     * Where to redirect users after login / registration.
     *
     * @var string
     */
    protected $redirectTo = '/admin';

    /**
     * Create a new controller instance.
     *
     * @return void
     */
    public function __construct()
    {
        $this->middleware('guest.admin', ['except' => 'logout']);
    }

    /**
     * 顯示后臺登錄模板
     */
    public function showLoginForm()
    {
        return view('admin.login');
    }

    /**
     * 使用 admin guard
     */
    protected function guard()
    {
        return auth()->guard('admin');
    }

    /**
     * 重寫驗證時使用的用戶名字段
     */
    public function username()
    {
        return 'name';
    }
}

后臺顯示模板

復(fù)制 views/layouts/app.blade.phpviews/layouts/admin.blade.php
編輯后臺管理布局模板

<html lang="en">
<head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">

    <!-- CSRF Token -->
    <meta name="csrf-token" content="{{ csrf_token() }}">

    <title>{{ config('app.name', 'Laravel') }} - Admin</title>

    <!-- Styles -->
    <link href="{{ asset('css/app.css') }}" rel="stylesheet">
</head>
<body>
<nav class="navbar navbar-default navbar-static-top">
    <div class="container">
        <div class="navbar-header">

            <!-- Collapsed Hamburger -->
            <button type="button" class="navbar-toggle collapsed" data-toggle="collapse"
                    data-target="#app-navbar-collapse">
                <span class="sr-only">Toggle Navigation</span>
                <span class="icon-bar"></span>
                <span class="icon-bar"></span>
                <span class="icon-bar"></span>
            </button>

            <!-- Branding Image -->
            <a class="navbar-brand" href="{{ url('/') }}">
                {{ config('app.name', 'Laravel') }}
            </a>
        </div>

        <div class="collapse navbar-collapse" id="app-navbar-collapse">
            <!-- Left Side Of Navbar -->
            <ul class="nav navbar-nav">
                &nbsp;
            </ul>

            <!-- Right Side Of Navbar -->
            <ul class="nav navbar-nav navbar-right">
                <!-- Authentication Links -->
                @if (auth()->guard('admin')->guest())
                    <li><a href="{{ url('/admin/login') }}">Login</a></li>
                    {{--<li><a href="{{ route('register') }}">Register</a></li>--}}
                @else
                    <li class="dropdown">
                        <a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button"
                           aria-expanded="false" aria-haspopup="true">
                            {{ auth()->guard('admin')->user()->name }} <span class="caret"></span>
                        </a>

                        <ul class="dropdown-menu">
                            <li>
                                <a href="{{ url('/admin/logout')}}"
                                   onclick="event.preventDefault();
                                                 document.getElementById('logout-form').submit();">
                                    Logout
                                </a>

                                <form id="logout-form" action="{{ url('/admin/logout')}}" method="POST"
                                      style="display: none;">
                                    {{ csrf_field() }}
                                </form>
                            </li>
                        </ul>
                    </li>
                @endif
            </ul>
        </div>
    </div>
</nav>

@yield('content')

<!-- Scripts -->
<script src="{{ asset('js/app.js') }}"></script>
</body>
</html>

復(fù)制 views/auth/login.blade.phpviews/admin/login.blade.php
編輯該模板货岭,更改布局文件為 layouts.admin路操, 把表單的提交 url 改為 admin/login,email 字段改成 name字段茴她,去掉找回密碼的部分

@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">Admin Login</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('name') ? ' has-error' : '' }}">
                                <label for="name" class="col-md-4 control-label">Name</label>

                                <div class="col-md-6">
                                    <input id="name" type="text" class="form-control" name="name" value="{{ old('name') }}" required autofocus>

                                    @if ($errors->has('name'))
                                        <span class="help-block">
                                        <strong>{{ $errors->first('name') }}</strong>
                                    </span>
                                    @endif
                                </div>
                            </div>

                            <div class="form-group{{ $errors->has('password') ? ' has-error' : '' }}">
                                <label for="password" class="col-md-4 control-label">Password</label>

                                <div class="col-md-6">
                                    <input id="password" type="password" class="form-control" name="password" required>

                                    @if ($errors->has('password'))
                                        <span class="help-block">
                                        <strong>{{ $errors->first('password') }}</strong>
                                    </span>
                                    @endif
                                </div>
                            </div>

                            <div class="form-group">
                                <div class="col-md-6 col-md-offset-4">
                                    <div class="checkbox">
                                        <label>
                                            <input type="checkbox" name="remember"> Remember Me
                                        </label>
                                    </div>
                                </div>
                            </div>

                            <div class="form-group">
                                <div class="col-md-8 col-md-offset-4">
                                    <button type="submit" class="btn btn-primary">
                                        Login
                                    </button>
                                </div>
                            </div>
                        </form>
                    </div>
                </div>
            </div>
        </div>
    </div>
@endsection</pre>

復(fù)制 views/home.blade.phpviews/admin/index.blade.php
編輯該模板

  @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">Dashboard</div>
  
                 <div class="panel-body">1           
          You are logged in admin dashboard!
               </div>
             </div>
         </div>
     </div>
 </div>
 @endsection</pre>

添加后臺路由

編輯 routes/web.php寻拂, 添加以下內(nèi)容

 Route::group(['prefix' => 'admin'], function () { 
     Route::group(['middleware' => 'auth.admin'], function () {
         Route::get('/', 'Admin\IndexController@index'); 
 });
  
    Route::get('login', 'Admin\LoginController@showLoginForm')->name('admin.login');
      Route::post('login', 'Admin\LoginController@login'); 
     Route::post('logout', 'Admin\LoginController@logout'); 
 });

后臺管理認證中間件

創(chuàng)建后臺管理認證中間件
編輯 AuthAdmin

 <?php

 namespace App\Http\Middleware;

 use Closure; 

 class AuthAdmin 
{
  /** 
 * Handle an incoming request. 
*
 * @param  \Illuminate\Http\Request  $request
 * @param  \Closure  $next 
 * @return mixed 
      */
    public function handle($request, Closure $next)
{ 
         if (auth()->guard('admin')->guest()) { 
            if ($request->ajax() || $request->wantsJson()) { 
                return response('Unauthorized.', 401); 

             } else {
               return redirect()->guest('admin/login');
  }
} 

        return $next($request); 
 } 
 }

創(chuàng)建后臺管理登錄跳轉(zhuǎn)中間件,用于有些操作在登錄之后的跳轉(zhuǎn)
編輯該中間件的 handle 方法

 public function handle($request, Closure $next)
 { 
         if (auth()->guard('admin')->check()) {
            return redirect('/admin'); 
     }

       return $next($request);
  }

app/Http/Kernel.php 中注冊以上中間件

     protected $routeMiddleware = [
         ......
         'auth.admin' => \App\Http\Middleware\AuthAdmin::class,
         'guest.admin' => \App\Http\Middleware\GuestAdmin::class,\
       ..........
     ];   

處理注銷

經(jīng)過上面的步驟丈牢,已經(jīng)實現(xiàn)了前后臺分離登錄,但是不管是在前臺注銷瞄沙,還是在后臺注銷己沛,都銷毀了所有的 session,導(dǎo)致前后臺注銷連在一起距境。所以我們還要對注銷的方法處理一下申尼。

原來的 logout 方法是這樣寫的,在 Illuminate\Foundation\Auth\AuthenticatesUsers

      public function logout(Request $request)
      {
          $this->guard()->logout();
 
          $request->session()->flush();
  
          $request->session()->regenerate();
  
          return redirect('/');
   }

注意這一句

 $request->session()->flush();

將所有的 session 全部清除垫桂,這里不分前臺师幕、后臺,所以要對這里進行改造诬滩。
因為前臺霹粥、后臺注銷都要修改,所以我們新建一個 trait疼鸟,前后臺都可以使用后控。
新建一個文件 app/Extensions/AuthenticatesLogout.php

  <?php
  namespace App\Extensions;
  
  use Illuminate\Http\Request; 

 
  trait AuthenticatesLogout
  {
      public function logout(Request $request) 
 {
       $this->guard()->logout();

         $request->session()->forget($this->guard()->getName());

         $request->session()->regenerate(); 
 
        return redirect('/'); 
 } 
}

我們將上面的那一句改成

 $request->session()->forget($this->guard()->getName());

只是刪除掉當前 guard 所創(chuàng)建的 session,這樣就達到了分別注銷的目的空镜。
修改 Auth/LoginController.phpAdmin/LoginController.php浩淘,將

class LoginController extends Controller
 {
  use AuthenticatesUsers;

改掉捌朴,在文件的前面別忘了加上 use 語句

use App\Extensions\AuthenticatesLogout; 
 .. ..
  
class LoginController extends Controller 
 {
    use AuthenticatesUsers, AuthenticatesLogout {
         AuthenticatesLogout::logout insteadof AuthenticatesUsers;
 }

到這里,就完成了整個不同用戶表登錄認證的過程张抄。

參考Laravel5.3多用戶表登錄

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末砂蔽,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子署惯,更是在濱河造成了極大的恐慌察皇,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,997評論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件泽台,死亡現(xiàn)場離奇詭異什荣,居然都是意外死亡,警方通過查閱死者的電腦和手機怀酷,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,603評論 3 392
  • 文/潘曉璐 我一進店門稻爬,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人蜕依,你說我怎么就攤上這事桅锄。” “怎么了样眠?”我有些...
    開封第一講書人閱讀 163,359評論 0 353
  • 文/不壞的土叔 我叫張陵友瘤,是天一觀的道長。 經(jīng)常有香客問我檐束,道長辫秧,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,309評論 1 292
  • 正文 為了忘掉前任被丧,我火速辦了婚禮盟戏,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘甥桂。我一直安慰自己柿究,他們只是感情好,可當我...
    茶點故事閱讀 67,346評論 6 390
  • 文/花漫 我一把揭開白布黄选。 她就那樣靜靜地躺著蝇摸,像睡著了一般。 火紅的嫁衣襯著肌膚如雪办陷。 梳的紋絲不亂的頭發(fā)上貌夕,一...
    開封第一講書人閱讀 51,258評論 1 300
  • 那天,我揣著相機與錄音懂诗,去河邊找鬼蜂嗽。 笑死,一個胖子當著我的面吹牛殃恒,可吹牛的內(nèi)容都是我干的植旧。 我是一名探鬼主播辱揭,決...
    沈念sama閱讀 40,122評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼病附!你這毒婦竟也來了问窃?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,970評論 0 275
  • 序言:老撾萬榮一對情侶失蹤完沪,失蹤者是張志新(化名)和其女友劉穎域庇,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體覆积,經(jīng)...
    沈念sama閱讀 45,403評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡听皿,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,596評論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了宽档。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片尉姨。...
    茶點故事閱讀 39,769評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖吗冤,靈堂內(nèi)的尸體忽然破棺而出又厉,到底是詐尸還是另有隱情,我是刑警寧澤椎瘟,帶...
    沈念sama閱讀 35,464評論 5 344
  • 正文 年R本政府宣布覆致,位于F島的核電站,受9級特大地震影響肺蔚,放射性物質(zhì)發(fā)生泄漏煌妈。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,075評論 3 327
  • 文/蒙蒙 一婆排、第九天 我趴在偏房一處隱蔽的房頂上張望声旺。 院中可真熱鬧,春花似錦段只、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,705評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至坪创,卻和暖如春炕婶,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背莱预。 一陣腳步聲響...
    開封第一講書人閱讀 32,848評論 1 269
  • 我被黑心中介騙來泰國打工柠掂, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人依沮。 一個月前我還...
    沈念sama閱讀 47,831評論 2 370
  • 正文 我出身青樓涯贞,卻偏偏與公主長得像枪狂,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子宋渔,可洞房花燭夜當晚...
    茶點故事閱讀 44,678評論 2 354

推薦閱讀更多精彩內(nèi)容