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、測試:重新整理瀏覽器,輸入手機號和密碼登入,你就會看到成功的曙光: