1. 程式人生 > >Laravel多使用者登入註冊(例:3個使用者,管理員,企業,普通使用者)

Laravel多使用者登入註冊(例:3個使用者,管理員,企業,普通使用者)

在實際專案開發中,我們經常會遇到多種型別的使用者認證問題,比如後臺管理員,企業和前端普通使用者3個使用者。網上找的很多例子都是兩個使用者的登入,而且有些例子寫的都是錯的,那如何來完成此類功能呢,我們首先想到應該是中介軟體,接下來我就逐一跟大家分析。

一、建立專案
開啟MAC自帶終端,輸入:Laravel new test,配置虛擬機器test.com,開啟瀏覽器訪問此網址即可進入Laravel首頁。

二、資料庫配置
在MySQL管理軟體中建立資料庫testuser,並在.env檔案中配置資料庫。如:

三、前端普通使用者(user,我們使用使用者名稱登入)
1、終端執行命令:php artisan make:auth 生成使用者認證所需的路由和模板。此時檢視web.php發現路由已更新。
2、 接下來我們執行遷移命令:php artisan migrate生成資料表,然後在資料庫中你重新整理一下就會發現多了幾張表。
3、再去重新整理瀏覽器,頁面的右上角多了登入和註冊按鈕,我們隨即註冊一個使用者 user,註冊成功跳轉到首頁。此時資料庫中已插入一條資料。
4、接下來我們可以使用這個賬號去登入了,由於Laravel預設的登入是使用郵箱的,所以這裡我們需要在app\Http\Controllers\Auth\LoginController中新增如下程式碼設定預設登入使用使用者名稱,當然對應模板的name也要改過來。

public function username()
{
  return 'name';
}

5、測試:去前端登入頁面,輸入賬號密碼,可以看到如下介面:

至此,前端普通使用者認證成功!

四、後臺認證(admin,我們使用郵箱登入)
1、 先去web.php檔案中配置路由組:

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

2、生成後臺首頁控制器:php artisan make:controller Admin/DashboardController並建立index方法,裡面直接列印管理員session,如:

public function index()
{
    dd('後臺首頁,當前管理員:' . auth('admin')->user()->name);
}

3、建立管理員(admins)資料表
(1) 生成admins表的遷移檔案:php artisan make:migration create_admins_table,
(2) 修改 database/migrations/*_create_admins_table.php 中的 up()方法,如:

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

終端執行php artisan migrate, 手動往資料表admins裡面新增一條資料。
(3) 生成資料表模型:php artisan make:model Models/Admin,並修改app/Models/Admin.php為:

<?php
namespace App\Models;
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',
    ];
}

(4) 修改路由組,如下:

Route::prefix('admin')->namespace('Admin')->group(function () {
    $this->get('login', '[email protected]')->name('admin.login');
    $this->post('login', '[email protected]');
    $this->post('logout', '[email protected]')->name('admin.logout');
    Route::name('admin.')->group(function () {
        $this->get('/', '[email protected]');
    });
});

(5) 新建管理員登入控制器:php artisan make:controller Admin/LoginController,新增程式碼如下:

<?php

namespace App\Http\Controllers\Admin;

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');
    }

    public function showLoginForm()
    {
        return view('admin.auth.login');
    }

    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()->invalidate();

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

(6) 新增管理員認證,修改config/auth.php檔案,如:

'guards' => [
    'web' => [
        'driver' => 'session',
        'provider' => 'users',
    ],
    'admin' => [
        'driver' => 'session',
        'provider' => 'admins',
    ],
    'api' => [
        'driver' => 'token',
        'provider' => 'users',
    ],
],
'providers' => [
    'users' => [
        'driver' => 'eloquent',
        'model' => App\User::class,
    ],
    'admins' => [
        'driver' => 'eloquent',
        'model' => App\Models\Admin::class,
    ]

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

(7) 新建登入模板 resources/views/admin/auth/login.blade.php ,我這裡使用amazeui自帶的登入模板,使用之前必須引入amazeui的樣式。注意:修改登入提交的路由地址{{ route(‘admin.login’) }}。
通過命令:php artisan make:middleware AdminAuthMiddleware建立後臺管理員中介軟體,並新增程式碼如下:

<?php
namespace App\Http\Middleware;
use Closure;
use Illuminate\Support\Facades\Auth;
class AdminAuthMiddleware
{
    public function handle($request, Closure $next, $guard = null)
    {
    //當 auth 中介軟體判定某個使用者未認證,會返回一個 JSON 401 響應,或者,如果不是 Ajax 請求的話,將使用者重定向到 login 命名路由(也就是登入頁面)。
        if (Auth::guard($guard)->guest()) {
            if ($request->ajax() || $request->wantsJson()) {
                return response('Unauthorized.', 401);
            } else {
                return redirect()->guest('admin/login');
            }
        }
        return $next($request);
    }
}

接下來去app\Http\Kernel.php裡面註冊該中介軟體 ‘auth.admin’ => \App\Http\Middleware\AdminAuthMiddleware::class, ,並在web.php中使用此中介軟體,
此時的路由如下:

Route::prefix('admin')->namespace('Admin')->group(function () {
    $this->get('login', '[email protected]')->name('admin.login');
    $this->post('login', '[email protected]');
    $this->post('logout', '[email protected]')->name('admin.logout');
    Route::middleware('auth.admin:admin')->name('admin.')->group(function () {
        $this->get('/', '[email protected]');
    });
});

重新整理瀏覽器,進入後臺登入頁面,輸入郵箱密碼看到如下頁面,說明管理員登入就大功告成啦。

至此,普通使用者和管理員兩個登入已完成。

五、企業後臺登入(company,我們使用手機號登入)
1、首先我們定義企業後臺路由,如下:

Route::prefix('company')->namespace('Company')->group(function () {
    $this->get('login', '[email protected]')->name('company.login');
    $this->post('login', '[email protected]');
    $this->post('logout', '[email protected]')->name('company.logout');
    Route::name('company.')->group(function () {
        $this->get('/', '[email protected]');
    });
});

2、建立登入控制器 php artisan make:controller Company/LoginController

<?php
namespace App\Http\Controllers\Company;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use Illuminate\Foundation\Auth\AuthenticatesUsers;

class LoginController extends Controller
{
    use AuthenticatesUsers;

    /**
     *  預設使用手機號登陸
     * Get the login username to be used by the controller.
     *
     * @return string
     */
    public function username()
    {
        return 'mobile';
    }

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

    /**
     * Create a new controller instance.
     *
     * @return void
     */
    public function __construct()
    {
        $this->middleware('guest:company', ['except' => 'logout']);
        $this->username = config('company.global.username');
    }
    /**
     * 重寫登入檢視頁面
     * @author Holy
     * @date   2018-04-02
     * @return [type]
     */
    public function showLoginForm()
    {
        return view('company.auth.login');
    }
    /**
     * 自定義認證驅動
     * @author Holy
     * @date   2018-04-02
     * @return [type]
     */
    protected function guard()
    {
        return auth()->guard('company');
    }

    /**
     * 企業後臺退出跳轉到後臺登入頁面
     * 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()->invalidate();

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

3、建立企業後臺首頁控制器:php artisan make:controller Company/CompanyController,直接列印session

public function index()
{
   dd('企業後臺首頁,當前使用者名稱:'.auth('company')->user()->name);
}

4、 建立企業(companies)資料表

(1) 生成companies表的遷移檔案:php artisan make:migration create_companies_table,並新增如下程式碼:

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

(2) 執行遷移命令:php artisan migrate建立資料表companies,手動填充資料。
(3) 終端跑命令建立模型:php artisan make:model Models/Company

<?php
namespace App\Models;
use Illuminate\Notifications\Notifiable;
use Illuminate\Foundation\Auth\User as Authenticatable;

class Company extends Authenticatable
{
    use Notifiable;

    /**
     * The attributes that are mass assignable.
     *
     * @var array
     */
    protected $guarded = [];

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

}

5、接下來去 config/auth.php 新增模型,如:

'guards' => [
    'web' => [
        'driver' => 'session',
        'provider' => 'users',
    ],
    'admin' => [
        'driver' => 'session',
        'provider' => 'admins',
    ],
    'company' => [
        'driver' => 'session',
        'provider' => 'companies',
    ],
    'api' => [
        'driver' => 'token',
        'provider' => 'users',
    ],
],
'providers' => [
    'users' => [
        'driver' => 'eloquent',
        'model' => App\User::class,
    ],
    'admins' => [
        'driver' => 'eloquent',
        'model' => App\Models\Admin::class,
    ],
    'companies' => [
        'driver' => 'eloquent',
        'model' => App\Models\Company::class,
    ]
    // 'users' => [
    //     'driver' => 'database',
    //     'table' => 'users',
    // ],
],

6、 然後重新整理頁面,提示檢視未載入。此刻,我們去建立檢視模板:

7、 接下來,我們去建立企業中介軟體,終端執行命令:php artisan make:middleware CompanyAuthMiddleware,新增如下程式碼:

<?php

namespace App\Http\Middleware;

use Closure;
use Illuminate\Support\Facades\Auth;
class CompanyAuthMiddleware
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    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('company/login');
            }
        }
        return $next($request);
    }
}

註冊中介軟體:Kernel.php中新增:‘auth.company’=>\App\Http\Middleware\CompanyAuthMiddleware::class,
使用中介軟體:web.php中設定路由組,如下:

Route::prefix('company')->namespace('Company')->group(function () {
    $this->get('login', '[email protected]')->name('company.login');
    $this->post('login', '[email protected]');
    $this->post('logout', '[email protected]')->name('company.logout');

    Route::middleware('auth.company:company')->name('company.')->group(function ()  {
        $this->get('/', '[email protected]');

    });
});

8、測試:重新整理瀏覽器,輸入手機號和密碼登入,你就會看到成功的曙光: