1. 程式人生 > >laravel5.5前後臺登入認證實現過程詳解

laravel5.5前後臺登入認證實現過程詳解

認證原理
     Laravel 的認證元件由 guards 和 providers 組成,guard 定義了使用者在每個請求中如何實現認證,例如,Laravel 通過session guard 來維護 Session 儲存的狀態和 Cookie。provider 定義瞭如何從持久化儲存中獲取使用者資訊,laravel 底層支援通過 Eloquent 和資料庫查詢構建器兩種方式來獲取使用者。
     瞭解了它的認證原理,那麼讓我們開始去實現前後臺登入認證吧。前臺的認證使用預設的就好,這裡主要講怎麼在有前臺認證的情況下同時實現後臺驗證。

1、生成laravel自帶的認證腳手架
     $ php artisan make:auth
     以上命令將自動生成auth模板資料夾和layouts模板資料夾以及路由資訊:
        Auth::routes();
        Route::get('/home',

'[email protected]')->name('home');

2、修改config/auth.php配置,新增後臺認證資訊
    2.1 在 gurads 處,新增 admin guard 用於後臺管理員認證
        'admin' => [
            'driver' => 'session',
           'provider' => 'admins',
        ],
    2.2 在 providers 處新增 admins provider,使用 Admin 模型
        'admins' => [
            'driver' => 'eloquent',
            'model' => App\Http\Model\Admin\Admin::class,
        ],

3、建立後臺管理員模型
    $ php artisan make:model Http/Model/Admin/Admin -m
    //-m 引數會同時生成資料庫遷移檔案 xxx_create_admins_table
    //等同於
    //php artisan make:model Admin
    //php artisan make:migration creaet_admins_table

4、修改資料庫遷移檔案xxx _create_admins_table
    Schema::create('admins', function (Blueprint $table) {
        $table->increments('id');
        $table->string('name');
        $table->string('email')->unique();
        $table->string('password');
        $table->rememberToken();
        $table->timestamps();
   });

5、建立表並生成臨時資料
    5.1 database/factories/ModelFactory.php, 新增資料:
        $factory->define(App\Http\Model\Admin\Admin::class, function (Faker\Generator $faker) {
            static $password;

            return [
                'name' => $faker->name,
                'password' => $password ?: $password = bcrypt('123456'),
                'email' =>  $faker->email,
                'remember_token' => str_random(10),
            ];
        });
    5.2 生成資料方式1---使用tinker:
        $ php artisan tinker
        use App;
        factory(App\Http\Model\Admin\Admin::class,5)->create();//3表示生成3條測試資料
    5.3 方式2---在 database/seeds 目錄下生成 AdminsTableSeeder.php 檔案
        $ php artisan make:seeder AdminsTableSeeder
        編輯該檔案
            public function run()
            {
                factory('App\Http\Model\Admin\Admin', 3)->create([//3表示生成3條測試資料
                    'password' => bcrypt('123456')
                ]);
            }

        在 database/seeds/DatabaseSeeder.php 的 run 方法裡呼叫 AdminsTableSeeder 類
            public function run()
            {
                $this->call(AdminsTableSeeder::class);
            }
        執行資料庫遷移命令
            $ php artisan migrate --seed

        資料庫裡會建立 admins 表,並且生成了3條資料

6、修改 app/Http/Model/Admin/Admin.php 模型檔案
    namespace App\Http\Model\Admin;
    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', 'email', 'password',
        ];
        /**
        * The attributes that should be hidden for arrays.
        *
        * @var array
        */
        protected $hidden = [
            'password', 'remember_token',
        ];
    }

7、建立控制器
    $ php artisan make:controller Admin/LoginController
    $ php artisan make:controller Admin/AdminController

8、編輯 Admin/LoginController.php:
    <?php
        namespace App\Http\Controllers\Admin;
        use Illuminate\Http\Request;
        use App\Http\Controllers\Controller;
        use Illuminate\Foundation\Auth\ThrottlesLogins;
        use Illuminate\Foundation\Auth\AuthenticatesUsers;
        class LoginController extends Controller
        {
            use AuthenticatesUsers;
            /**
            * Where to redirect users after login / registration.
            *
            * @var string
            */
            protected $redirectTo = '/admin/index';
            protected $username;
            /**
            * Create a new controller instance.
            *
            * @return void
            */
            public function __construct()
            {
                //$this->middleware('guest.admin')->except('logout');//使用自定義的中介軟體
                $this->middleware('guest:admin')->except('logout');//冒號後面的admin作為引數傳給中介軟體的$guard形參
                $this->username = config('admin.global.username');
            }
            /**
            * 重寫登入檢視頁面
            */
            public function showLoginForm()
            {
                return view('admin.auth.login');
            }
            /**
            * 自定義認證驅動
            * @return mixed
            */
            protected function guard()
            {
                return auth()->guard('admin');
            }
            /**
            * 重寫驗證時使用的使用者名稱欄位
            */
            public function username()
            {
                return 'name';//預設為使用郵箱驗證,這裡可以改成使用者名稱
            }
            /**
            * 重寫退出登入
            *
            * @param  \Illuminate\Http\Request  $request
            * @return \Illuminate\Http\Response
            */
            public function logout(Request $request)
            {
                $this->guard()->logout();
                $request->session()->forget($this->guard()->getName());
                $request->session()->regenerate();
                return redirect('/admin');
            }
        }

9、修改 app\Http\Middleware\RedirectIfAuthenticated.php
    public function handle($request, Closure $next, $guard = null)
    {
        if (Auth::guard($guard)->check()) {
            // 根據不同 guard 跳轉到不同的頁面
            $url = $guard ? 'admin/index':'/home';
            return redirect($url);
        }
        return $next($request);
    }

10、編輯 Admin\AdminController.php:(作為後臺基類)
    /**
    * Create a new controller instance.
    *
    * @return void
    */
    public function __construct()
    {
        $this->middleware('auth.admin:admin');
    }
    //
    public function index()
    {
        //dd('使用者名稱:'.auth('admin')->user()->name);
        return view('admin.index');
    }

11、建立中介軟體
    11.1 建立後臺管理認證中介軟體
        $ php artisan make:middleware AuthAdmin

        use Closure;
        use Illuminate\Support\Facades\Auth;
        public function handle($request, Closure $next, $guard = null)
        {
            if (Auth::guard($guard)->guest()) {
                if ($request->ajax() || $request->wantsJson()) {
                    return response('Unauthorized.', 401);
                } else {
                    return redirect()->guest('admin/login');
                }
            }
            return $next($request);
        }
    11.2 建立後臺管理登入跳轉中介軟體,用於登入之後再訪問登入路由時的跳轉
        11.2.1 如果LoginController中使用的中介軟體是'guest:admin',也就是RedirectIfAuthenticated,那麼只要修改RedirectIfAuthenticated中介軟體即可
            public function handle($request, Closure $next, $guard = null)
            {
                if (Auth::guard($guard)->check()) {
                    //return redirect('/home');
                    // 根據不同 guard 跳轉到不同的頁面
                    $url = $guard ? 'admin/index':'/home';
                    return redirect($url);
                }
                return $next($request);
            }
        11.2.2 如果LoginController中使用的中介軟體是'guest.admin',那麼建立後臺管理登入跳轉中介軟體,並註冊為guest.admin
            $ php artisan make:middleware GuestAdmin
            public function handle($request, Closure $next)
            {
                if (auth()->guard('admin')->check()) {
                    return redirect('/admin');
                }
                return $next($request);
            }

12、在 app\Http\Kernel.php 中註冊中介軟體:
    protected $routeMiddleware = [
        ******
        'auth.admin' => \App\Http\Middleware\AuthAdmin::class,
        'guest.admin' => \App\Http\Middleware\GuestAdmin::class,
    ];

15、檢視檔案建立和修改
    複製 views/layouts/app.blade.php  到 views/layouts/admin.blade.php
    複製 views/home.blade.php           到 views/admin/index.blade.php
    複製 views/auth/login.blade.php,   到 views/admin/auth/login.blade.php
    修改表單提交地址
        {{ url('/login') }} 改成 {{ route('admin.login') }}
    修改繼承的模板
        @extends('layouts.app') 改成 @extends('layouts.admin')

相關推薦

laravel5.5前後臺登入認證實現過程

認證原理      Laravel 的認證元件由 guards 和 providers 組成,guard 定義了使用者在每個請求中如何實現認證,例如,Laravel 通過session guard 來維護 Session 儲存的狀態和 Cookie。provider 定義

淺談Web緩存-緩存的實現過程

根據 直觀 pre -i sha 轉載 align 緩存 請求轉發 在前端開發中,性能一直都是被大家所重視的一點,然而判斷一個網站的性能最直觀的就是看網頁打開的速度。其中提高網頁反應速度的一個方式就是使用緩存。一個優秀的緩存策略可以縮短網頁請求資源的距離,減少延遲,並且

轉 深入解析:一主多備DG環境,failover的實現過程 以及 11g 容災庫可以線上新增tempfile.

https://yq.aliyun.com/articles/229600   核心,就是11g通過datafille_scn 號來追日誌,而不是日誌序列號來追日誌。   摘要: 在DG中,switchover和failover是兩個重要的概念,也是DG實現的核心。根據不

函式呼叫實現過程(棧空間解析)

轉自:函式呼叫棧 剖析+圖解   棧: 在函式呼叫時,第一個進棧的是主函式中函式呼叫後的下一條指令(函式呼叫語句的下一條可執行語句)的地址,然後是函式的各個引數,在大多數的C編譯器中,引數是由右往左入棧的,然後是函式中的區域性變數。注意靜態變數是不入棧的。 當本次函式

楊輝三角形實現過程-C語言基礎

這一篇要探討的是“楊輝三角形的實現以及如何人工走迴圈”。涉及的知識點和內容很少,主要是想說明如何看懂迴圈,如何跟著迴圈走。屬於C語言基礎篇。 學習程式設計的人,在學習的初期,幾乎都會接觸楊輝三角形。但與其說用程式碼實現輸出楊輝三角形是一道程式設計題,倒不如說它是一道IQ題。因

PHP 單點登入SSO實現方式

SSO( Single Sign On ),即單點登入,是一種控制多個相關但彼此獨立的系統的訪問許可權, 擁有這一許可權的使用者可以使用單一的ID和密碼訪問某個或多個系統從而避免使用不同的使用者名稱或密碼,或者通過某種配置無縫地登入每個系統 。 對於大型系統來

登入認證及授權

Apache Shiro 是一個強大而靈活的開源安全框架,它乾淨利落地處理身份認證,授權,企業會話管理和加密。Apache Shiro 的首要目標是易於使用和理解。安全有時候是很複雜的,甚至是痛苦的,但它沒有必要這樣。框架應該儘可能掩蓋複雜的地方,露出一個乾淨而直觀的 API

Nginx實現集群的負載均衡配置過程

post 發現 forward too strong eight glin 內容 請求 Nginx實現集群的負載均衡配置過程詳解 Nginx 的負載均衡功能,其實實際上和 nginx 的代理是同一個功能,只是把代理一臺機器改為多臺機器而已。 Nginx 的負載均衡

使用HeartBeat實現高可用HA的配置過程

接口 dea ive for 64位 doc 主機名 停止 enforce 使用HeartBeat實現高可用HA的配置過程詳解 一、寫在前面 HA即(high available)高可用,又被叫做雙機熱備,用於關鍵性業務。簡單理解就是,有2臺機器 A 和 B,正常

python中matplotlib實現最小二乘法擬合的過程

ast array plt atp ons 正則 key code 擬合 這篇文章主要給大家介紹了關於python中matplotlib實現最小二乘法擬合的相關資料,文中通過示例代碼詳細介紹了關於最小二乘法擬合直線和最小二乘法擬合曲線的實現過程,需要的朋友可以參考借鑒,下

大資料教程(8.8)MR內部的shuffle過程&combiner的執行機制及程式碼實現

        之前的文章已經簡單介紹過mapreduce的運作流程,不過其內部的shuffle過程並未深入講解;本篇部落格將分享shuffle的全過程。       

大資料教程(8.8)MR內部的shuffle過程&combiner的執行機制及程式碼實現

        之前的文章已經簡單介紹過mapreduce的運作流程,不過其內部的shuffle過程並未深入講解;本篇部落格將分享shuffle的全過程。      

非對稱加密過程(基於RSA非對稱加密演算法實現

1、非對稱加密過程:         假如現實世界中存在A和B進行通訊,為了實現在非安全的通訊通道上實現資訊的保密性、完整性、可用性(即資訊保安的三個性質),A和B約定使用非對稱加密通道進行通訊,具體過程如下:   說明:         國內目前使用雙證書體系,即

nginx-1.15.5 windows下 64位版本編譯過程

編譯原始碼、工具、指令碼等和釋出在下面地址: 原始碼準備: 官網釋出的NGINX原始碼,不包含windows編譯部分,但是包含了主要的原始碼(片斷一): 下載地址:http://nginx.org/download/nginx-1.15.5.tar.gz windo

順序表的建立和初始化過程(C語言實現

順序表存放資料的特點和陣列這種資料型別完全吻合,因此順序表的實現使用的是陣列。需要注意的是,使用陣列實現順序表時,一定要預先申請足夠大的記憶體空間,避免因儲存空間不足,造成資料溢位,導致不必要的程式錯誤甚至崩潰。 在建立順序表時,除了預先申請記憶體空間,還需要實時記錄順序表的長度和順序表本身申請的記憶體大

uboot的移植之配置及編譯過程5

/***********************************************************************************     分析物件:原始碼主Makefile中進行配置時的一個重要的指令碼:mkconfig(MKCO

Shapley演算法解決舞伴問題過程(C++實現

舞伴問題是這樣的:有 n 個男孩與 n 個女孩參加舞會,每個男孩和女孩均交給主持一個名單,寫上他(她)中意的舞伴名字。無論男孩還是女孩,提交給主持人的名單都是按照偏愛程度排序的,排在前面的都是他們最中意的舞伴。試問主持人在收到名單後,是否可以將他們分成 n 對,使每個人都能和他們中意的舞伴結對跳舞?為了避免舞

SSO單點登入三種情況的實現方式

單點登入(SSO——Single Sign On)對於我們來說已經不陌生了。對於大型系統來說使用單點登入可以減少使用者很多的麻煩。就拿百度來說吧,百度下面有很多的子系統——百度經驗、百度知道、百度文庫等等,如果我們使用這些系統的時候,每一個系統都需要我們輸入使用者名稱和密碼登

用Axis2c 實現一個Web service 的小demo程式過程

/*    * Copyright 2004,2005 The Apache Software Foundation.    *    * Licensed under the Apache License, Version 2.0 (the "License");    * you 

Laravel5.5前後臺分離

經過網上查資料及自己摸索,終於實現了自己所想要實現的前後臺分離PS:在模板這一塊感覺還不夠完美,如果後邊找到更好的方法,到時會到這裡更新。前臺域名:www.test6.local後臺域名:admin.test6.local環境為:Win7x64+PHPStudy2018 ng