1. 程式人生 > >Laravel 5.3 使用內建的 Auth 元件實現多使用者認證功能以及登陸才能訪問後臺的功能的一種實現方法

Laravel 5.3 使用內建的 Auth 元件實現多使用者認證功能以及登陸才能訪問後臺的功能的一種實現方法

概述

在開發中,我們經常會遇到多種型別的使用者的認證問題,比如後臺的管理員和前臺的普通使用者。Laravel 5.3 內建的 Auth 元件已經能很好的滿足這項需求,下面大概記錄下使用方法。
另外,後臺頁面常常需要登入才能訪問,為了完成類似的功能,大家一般都習慣建立新的中介軟體來實現。但是 Auth 元件已經存在類似的中介軟體,我們可以在已有的基礎上進行完善,具體請看 後臺認證 -> 登陸才能訪問後臺的功能的一種實現方法
注意:這裡我們只考慮管理員和普通使用者存放在不同的表中的情況

建立專案

建立專案 E:\PhpStormProjects>composer create-project --prefer-dist laravel/laravel blog


進入專案 E:\PhpStormProjects>cd blog
執行專案 E:\PhpStormProjects\blog>php arstisan serve
看看效果 瀏覽器訪問http://localhost:8000

專案配置

資料庫配置 .env 中配置 DB 相關選項即可

前臺認證

資料庫遷移 E:\PhpStormProjects\blog>php artisan migrate
生成 Auth E:\PhpStormProjects\blog>php artisan make:auth

該命令應該在新安裝的應用下使用,它會生成 layout 佈局檢視,註冊和登入檢視,以及所有的認證路由,同時生成 HomeController ,用來處理登入成功後會跳轉到該控制器下的請求。

瀏覽器訪問 http://localhost:8000
我們看到右上角多了 LOGIN 和 REGISTER 的連結,我們可以試著註冊和登陸。
至此,前臺認證完成。

後臺認證

後臺首頁顯示

生成後臺首頁控制器 E:\PhpStormProjects\blog>php artisan make:controller Admin/IndexController
建立後臺首頁的檢視 resources/views/admin/index.blade.php

<html>
<head>
    <meta charset="UTF-8">
    <meta
name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>首頁 | 後臺系統</title> </head> <body> <h3>首頁</h3> </body> </html>

後臺首頁控制器 app/Http/Controllers/Admin/IndexController.php 新增方法

public function index()
{
    return view('admin/index');
}

路由檔案 routes/web.php 新增路由組

Route::group(['prefix' => 'admin'], function () {
    Route::get('/', 'Admin\[email protected]');
});

瀏覽器訪問 http://localhost:8000/admin 可看到後臺首頁
後臺首頁顯示完成

管理員資料表生成、資料表模型建立以及資料表填充

生成管理員資料表遷移檔案 E:\PhpStormProjects\blog>php artisan make:migration create_administrators_table
修改 database/migrations/*_create_administrators_table.php 中的 up() 與 down() 方法

public function up()
{
    Schema::create('administrators', function (Blueprint $table) {
        $table->increments('id');
        $table->string('name');
        $table->string('email')->unique();
        $table->string('password');
        $table->rememberToken();
        $table->timestamps();
    });
}

public function down()
{
    Schema::drop('administrators');
}

生成資料表 E:\PhpStormProjects\blog>php artisan migrate
至此,資料表建立
生成資料表模型 E:\PhpStormProjects\blog>php artisan make:model Models/Administrator
修改 app/Models/Administrator.php

<?php

namespace App\Models;

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

class Administrator 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',
    ];
}

提示:該模型根據app/User.php 修改
至此資料表模型建立完成
生成資料表填充檔案 E:\PhpStormProjects\blog>php artisan make:seeder AdministratorsTableSeeder
database/factories/ModelFactory.php 中新增

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

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

修改 database/seeds/AdministratorsTableSeeder.php 中的 run() 方法

public function run()
{
    factory(App\Models\Administrator::class, 3)->create([
        'password' => bcrypt('040313'),
    ]);
}

修改 database/seeds/DatabaseSeeder.php 中的 run() 方法

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

資料表填充 E:\PhpStormProjects\blog>php artisan db:seed
至此,資料表填充完成,在 administrators 中可看到 3 條樣例資料

管理員登陸頁面顯示

新建 app/Http/Controllers/Admin/Auth/LoginController.php

<?php

namespace App\Http\Controllers\Admin\Auth;

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.
     *
     * @var string
     */
    protected $redirectTo = '/admin';

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

    /**
     * 重寫 Show the application's login form.
     *
     * @return \Illuminate\Http\Response
     */
    public function showLoginForm()
    {
        return view('admin/auth/login');
    }
}

提示:該控制器內容根據 app/Http/Controllers/Auth/LoginController.php 修改
新建 resources/views/admin/Auth/login.blade.php ,複製 resources/views/auth/login.blade.php 的內容到這個檔案即可
注意:不要忘了修改登陸表單的 action 地址為 {{ url('/admin/login') }}
修改路由組

Route::group(['prefix' => 'admin'], function () {
    Route::get('login', 'Admin\Auth\[email protected]');

    Route::get('/', 'Admin\[email protected]');
});

至此,後臺登陸頁面顯示完成。訪問 http://localhost:8000/admin/login 可看到對應頁面

管理員認證

修改 config/auth.php ,在鍵為 guardsproviders 的陣列中新增管理員相關資訊

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

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

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

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

    // 'users' => [
    //     'driver' => 'database',
    //     'table' => 'users',
    // ],

    'administrators' => [
        'driver' => 'eloquent',
        'model' => App\Models\Administrator::class,
    ],
],

修改 app/Http/Controllers/Admin/Auth/LoginController.php

<?php

namespace App\Http\Controllers\Admin\Auth;

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

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.
     *
     * @var string
     */
    protected $redirectTo = '/admin';

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

    /**
     * 重寫 Show the application's login form.
     *
     * @return \Illuminate\Http\Response
     */
    public function showLoginForm()
    {
        return view('admin/auth/login');
    }

    /**
     * 重寫 Get the guard to be used during authentication.
     *
     * @return \Illuminate\Contracts\Auth\StatefulGuard
     */
    protected function guard()
    {
        return \Auth::guard('admin');
    }

    /**
     * 重寫 Log the user out of the application.
     *
     * @param \Illuminate\Http\Request  $request
     * @return \Illuminate\Http\Response
     */
    public function logout(Request $request)
    {
        $this->guard()->logout();

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

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

        return redirect('/admin/login');
    }
}

app/Http/Middleware/RedirectIfAuthenticated.phpguest 中介軟體。它的作用是當請求者請求登陸時,如果已登入則將其跳轉到合適頁面。如果請求的是後臺登陸頁面且已登入的話,我們應將其跳轉到後臺首頁,而不是預設的前臺首頁。修改其中的 handle() 方法

public function handle($request, Closure $next, $guard = null)
{
    if (Auth::guard($guard)->check()) {
        $path = $guard? '/admin' : '/home';
        return redirect($path);
    }

    return $next($request);
}

修改路由組

Route::group(['prefix' => 'admin'], function () {
    Route::get('login', 'Admin\Auth\[email protected]');
    Route::post('login', 'Admin\Auth\[email protected]');
    Route::post('logout', 'Admin\Auth\[email protected]');

    Route::get('/', 'Admin\[email protected]');
});

順便在後臺首頁新增一個登出連結,修改 resources/views/admin/index.blade.php

<html>
<head>
    <meta charset="UTF-8">
    <meta name="viewport"
          content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>首頁 | 後臺系統</title>
</head>
<body>
    <h3>首頁</h3>
    <p>
        狀態:
        @if(Auth::guard('admin')->check())
            已登入&nbsp;
            <a href="#"
                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>
        @else
            未登入
        @endif
    </p>
</body>
</html>

至此,管理員認證(登入與登出)已基本完成。
注意:由於後臺很少需要註冊功能,所以這部分功能實現不在考慮範圍

登陸才能訪問後臺的功能的一種實現方法

目前的後臺認證中,如果管理員沒有登入,他也能訪問後臺首頁,這顯然是有問題的。這裡,可以利用自帶的 Auth 系統的 vendor/laravel/framework/src/Illuminate/Auth/Middleware/Authenticate.php 這個中介軟體來實現。檢視其中的 authenticate() 方法

protected function authenticate(array $guards)
{
    if (empty($guards)) {
        return $this->auth->authenticate();
    }

    foreach ($guards as $guard) {
        if ($this->auth->guard($guard)->check()) {
            return $this->auth->shouldUse($guard);
        }
    }

    throw new AuthenticationException('Unauthenticated.', $guards);
}

如果管理員或者使用者沒有登入,則會丟擲認證異常。我們可以在 app/Exceptions/Handler.php 中處理這個異常,將登陸者轉到相應頁面。所以我們可以修改這個檔案中的 unauthenticated() 方法

protected function unauthenticated($request, AuthenticationException $exception)
{
    if ($request->expectsJson()) {
        return response()->json(['error' => 'Unauthenticated.'], 401);
    }

    if(in_array('admin', $exception->guards())) {
        return redirect()->guest('/admin/login');
    }
    return redirect()->guest('login');
}

修改路由組

Route::group(['prefix' => 'admin'], function () {
    Route::get('login', 'Admin\Auth\[email protected]');
    Route::post('login', 'Admin\Auth\[email protected]');
    Route::post('logout', 'Admin\Auth\[email protected]');

    Route::group(['middleware' => 'auth:admin'], function () {
        Route::get('/', 'Admin\[email protected]');
    });
});

至此,後臺登陸才能訪問。

測試環境

httpd-2.4.23-x64-vc11
php-5.6.24-Win32-VC11-x64
mysql-5.7.14-winx64

相關推薦

Laravel 5.3 使用Auth 元件實現多使用者認證功能以及登陸才能訪問後臺功能實現方法

概述 在開發中,我們經常會遇到多種型別的使用者的認證問題,比如後臺的管理員和前臺的普通使用者。Laravel 5.3 內建的 Auth 元件已經能很好的滿足這項需求,下面大概記錄下使用方法。 另外,後臺頁面常常需要登入才能訪問,為了完成類似的功能,大家一般都

易學筆記-第5章:數字/5.3 數字工具/5.3.2 數學函式

內建數學函式 pow:運算次方 abs:求絕對值 round:四捨五入保留N位小數 >>> a=1.235        >>> round(a,2)  &nbs

易學筆記-第5章:數字/5.3 數字工具/5.3.1 表示式操作符

表示式操作符 +:加 -:減 *:乘 /:除 %:求餘 ==:兩個數相等 <:小於 <=:小於等於 >:大於 >=:大於等於 >>:右位移 <<:左位移 **:

易學筆記-python語言-第5章:數字/5.3 數字工具/5.3.1 表示式操作符

表示式操作符: +:加 -:減 *:乘 /:除 %:求餘 ==:兩個數相等 <:小於 <=:小於等於 >:大於 >=:大於等於 >>:右位移 00011 >> 2:表示把最右邊的兩位移除掉

Laravel 5.3 使用置的 Auth 組件實現多用戶認證功能

where rules turn number model err 種類型 ddl handler https://blog.csdn.net/kevinbai_cn/article/details/54341779 概述 在開發中,我們經常會遇到多種類型的用戶的認證問題,

Laravel 5.3+ Auth::routes 驗證路徑

Laravel 5.3+ 開始,添加了Auth()::routes()路徑組,其中註冊了常見的驗證路徑,例如註冊,登入登出,以及密碼修改。 在web.php中,新增如下程式碼: Auth()::routes() 即可使用這些路徑。 而要檢視這些路徑具體包含了哪些,我們可以

laravel 5.3 單使用者登入簡單實現

需求描述 當前使用者只能在一個地方登入,即同一賬號不能再2個以上視窗登入,後登入者踢出前登入者。 設計思路 在使用者資料表中新增1個欄位,記錄當前登入用的session_id,當用戶登入的時候把session_id儲存到資料庫中,然後在中介軟體認證里加判斷,判斷當前使用者s

Laravel 5.3+ 如何定義API路徑(取消CSRF保護)

從Laravel 5.3+開始,API路徑被放入了routes/api.php中。我們絕大多數的路徑其實都會在web.php中定義,因為在web.php中定義的路徑預設有CSRF保護,而API路徑預設沒有CSRF保護。在Laravel官網文件中寫到: Any HTML forms poi

laravel 5.3 CURD

初學者的 CURD 控制器下的程式碼 路由設定 新增 /* * 新增 */ public function insert(){ input::all('name'); $name=$_PO

QT tableview控制元件

為什麼需要內建控制元件 tableview 預設的內建控制元件是QLineEdit,但是實際使用時,我們常常會有特殊需求,例如對QLineEdit有字數限制,性別有固定的選項等等,因此我們需要自定義ta

laravel 5.7 安裝 jwt-auth,jwt-auth 文件翻譯

laravel 5.7 安裝 jwt-auth(預設安裝的是 0.5.12 版本) github 地址: https://github.com/tymondesigns/jwt-auth 舊版文件: https://github.com/tymondesigns/jw

laravel-admin重寫檢視以及設定語言

重寫內建檢視 如果有需要自己修改view,但是不方便直接修改laravel-admin的情況,可以用下面的辦法解決 複製vendor/encore/laravel-admin/views到專案的re

laravel 5.3 route.php檔案

在Laravel 5.3中,app/Http/routes.php檔案被移動到routes目錄下,並且被分割成兩個檔案:web.php和api.php。web.php中的路由應用了web中介軟體組,而

laravel-blog:由 Laravel 5.3 強力驅動的快速、優雅、強大的部落格系統

Laravel Blog 快速,優雅, 強大的部落格系統,由Laravel5.3強力驅動。點選 這裡 檢視. 這是一個我個人使用的部落格,也曾經使用Hexo 和 github pages 搭過網站,都是都不靈活。因此用Laravel寫了這個部落格。 我想說的是Laravel是最好的php框架。 後續

附錄: Python 3 函式大全

#1.abs()絕對值或複數的模abs(-1)>>> 1#2.all()接受一個迭代器,如果迭代器的所有元素都為真,那麼返回True,否則返回Falseall([1,2,3])>>> True #3.any()接受一個迭代器,如果迭代器裡有

Laravel 5.3+ 自動新增建立時間與更新時間詳解

本文已經遷移至我的個人技術部落格: 在Laravel 5.3之前,migrations中的$table->timestamps()所建立的created_at及updated_at兩個col

Laravel 5.3 不同使用者表登入認證-優化

需要優化的地方:不需要新增中介軟體,【後臺管理認證中介軟體】部分全部去掉,使用框架自帶的中介軟體傳參就行了。 Admin/LoginController.php 中修改中介軟體: $this->middleware('guest.adm

thinkphp 5.1驗證規則

格式驗證類 格式驗證類在使用靜態方法呼叫的時候支援兩種方式呼叫(以number驗證為例,可以使用number() 或者 isNumber())。 require 驗證某個欄位必須,例如: 'name'=>'require' 如果驗證規則沒有新增requ

Laravel 5.3 使用者驗證原始碼探究 () 路由與註冊

簡介 Laravel 從 5.2 開始就有了開箱即用的使用者驗證,5.3 又在 5.2 的基礎上又有了一些改變。為了深入瞭解具體的使用者驗證實現,只能深入 Laravel 的原始碼,探究使用者驗證是怎麼處理的。 開始 安裝好 Laravel 5.3 的

DRF許可權元件之自定義許可權管理類

# DRF內建許可權元件permissions 許可權控制可以限制使用者對於檢視的訪問和對於具體資料物件的訪問。 - 在執行檢視的dispatch()方法前,會先進行檢視訪問許可權的判斷 - 在通過get_object()獲取具體物件時,會進行模型物件訪問許可權的判斷 在settings.py中設定DR