不知道對不對,亂來一下!!!!
1)laravel自帶了一個用戶認證系統,要使用的話,直接運行一下命令就可以用了
php artisan make:auth
會生成相應的控制器、路由和模版文件
2)數據遷移
php artisan migrate
會生成兩個數據遷移文件和相應的數據表(users 和 password_resets 表)(要先配置好數據庫連接)
3)多用戶認證
如果只是需要完善一個用戶資料字段,你只需要添加一個users表的數據遷移文件,再執行一下遷移就行了(看這里)
但如果想添加更多不同類型的用戶(比如后台用戶、商家用戶等等),要怎么辦呢?
4)修改用戶認證配置(增加“守衛”和“服務提供者”)
打開 config/auth.php 配置看一下就知道什么是“守衛”了
'guards' => [ 'web' => [ 'driver' => 'session', 'provider' => 'users', ], 'api' => [ 'driver' => 'token', 'provider' => 'users', ], ],
很明顯,所謂的“守衛”就laravel認證系統的端口,默認已經有兩個“守衛”了,一個守web進口的,一個守api接口進口的
現在如果想添加一個后台“守衛”的話,就增加一個配置就行了(driver 表示認證系統用什么來驅動,provider 表示認證服務由誰的提供)
'admin' => [ 'driver' => 'session', 'provider' => 'admins', ],
上面配置了一個admins服務提供者,所以相應的,還需要在 providers(服務提供者)列表里添加一個配置
'providers' => [ 'users' => [ 'driver' => 'eloquent', 'model' => App\User::class, ], 'admins' => [ 'driver' => 'eloquent', 'model' => App\Admin::class, ], ],
5)配置是弄好,但提供服務的 Eloquent 模型還是不存在的,所以我們就來創建吧
php artisan make:model Admin --migration
--migration參數是同時生成相應的數據遷移文件的意思
Admin模型的內容大概是這樣的:
<?php namespace App\Http\Controllers; use Illuminate\Http\Request; use Illuminate\Support\Facades\Auth; class AdminController extends Controller { public function __construct(){ $this->middleware('auth:admin'); } public function index(){ $user = Auth::user(); dd($user->email); return '后台!!!!'; } }
關鍵的地方是 $this->middleware('auth:admin'),關鍵laravel你要用的“守衛”是admin,否則打印的 Auth::user 將會是默認的前台用戶信息
6)按自己的需求填一下數據遷移文件,再執行一下遷移(生成數據表)(這里演示的偷懶了,直接復制前台的用戶表來玩的)
Schema::create('admins', function (Blueprint $table) { $table->increments('id'); $table->string('name'); $table->string('email')->unique(); $table->string('password', 60); $table->rememberToken(); $table->timestamps(); });
php artisan migrate
7)添加訪問路由,laravel5.3的auth路由在 /vendor/laravel/framework/src/Illuminate/Routing/Router.php 里的 auth 方法里
繼續偷懶,直接復制前台路由,加一個后台路由組就行了,大概是這個樣子:
$this->group(['prefix'=>'admin', 'namespace'=>'Admin', 'middleware'=>'adminview'], function(){ // Authentication Routes... $this->get('login', 'Auth\LoginController@showLoginForm')->name('login'); $this->post('login', 'Auth\LoginController@login'); $this->post('logout', 'Auth\LoginController@logout')->name('logout'); // Registration Routes... $this->get('register', 'Auth\RegisterController@showRegistrationForm')->name('register'); $this->post('register', 'Auth\RegisterController@register'); // Password Reset Routes... $this->get('password/reset', 'Auth\ForgotPasswordController@showLinkRequestForm'); $this->post('password/email', 'Auth\ForgotPasswordController@sendResetLinkEmail'); $this->get('password/reset/{token}', 'Auth\ResetPasswordController@showResetForm'); $this->post('password/reset', 'Auth\ResetPasswordController@reset'); });
可以看到,上面路由組里定義使用了一個Admin的命名空間和一個adminview的中間件,中間件的作用待會再說,我們先把命名空間下的控制器給搞定先~~
另外, routes/web.php 里一個后台前頁的路由
Route::get('/admin','AdminController@index');
8)路由有了,但Admin命名空間下的路由還一個控制器還沒有呢!!再再再偷懶,控制器也直接復制過去吧哈哈
LoginController 和 RegisterController 控制器里命名空間要改成
namespace App\Http\Controllers\Admin\Auth;
然后先說一下 RegisterController 控制器里的改動吧,有三處改動:
1、類頭部把 use App\User 改成 use App\Admin;
2、redirectTo 屬性值改成 protected $redirectTo = '/admin';
3、create 方法里把 User 模型改成 Admin 模型
完整的代碼是這樣的:

<?php namespace App\Http\Controllers\Admin\Auth; use App\Admin; use App\Http\Controllers\Controller; use Illuminate\Support\Facades\Validator; use Illuminate\Foundation\Auth\RegistersUsers; class RegisterController extends Controller { /* |-------------------------------------------------------------------------- | Register Controller |-------------------------------------------------------------------------- | | This controller handles the registration of new users as well as their | validation and creation. By default this controller uses a trait to | provide this functionality without requiring any additional code. | */ use RegistersUsers; /** * Where to redirect users after registration. * * @var string */ protected $redirectTo = '/admin'; /** * Create a new controller instance. * * @return void */ public function __construct() { $this->middleware('guest'); } /** * Get a validator for an incoming registration request. * * @param array $data * @return \Illuminate\Contracts\Validation\Validator */ protected function validator(array $data) { return Validator::make($data, [ 'name' => 'required|max:255', 'email' => 'required|email|max:255|unique:users', 'password' => 'required|confirmed', ]); } /** * Create a new user instance after a valid registration. * * @param array $data * @return User */ protected function create(array $data) { return Admin::create([ 'name' => $data['name'], 'email' => $data['email'], 'password' => bcrypt($data['password']), ]); } }
好了,再說一下 LoginController 控制器里的改動,也是三處改動:
1、類頭部聲明使用 Auth 門面,use Illuminate\Support\Facades\Auth;
2、redirectTo 屬性值改成 protected $redirectTo = '/admin';
3、加 guard 方法來自定義使用的 “守衛”,看這里
完整的代碼是這樣的:

<?php namespace App\Http\Controllers\Admin\Auth; use Illuminate\Support\Facades\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']); } protected function guard() { return Auth::guard('admin'); } }
9)OK,控制器也准備好了,該准備一下模版了,好,再再再再繼承偷懶,還是直接復制前台模版改一下哈哈
模版內容我也不改了,直接改一下form表單的提交地址分別成 {{ url('/admin/login') }} 和 {{ url('/admin/login') }}
10)好了,模版也有了,怎么訪問顯示模版呢?
從上面的路由可以看到,
登錄頁面的控制器方法叫 showLoginForm,它在 trait AuthenticatesUsers 里,大概是這樣:
注冊頁面的控制器方法叫 showRegistrationForm,它在 trait RegistersUsers 里,大概是這樣:
很明顯都是直接return 的前台模版(后台的模版地址是 admin.auth.login 和 admin.auth.register),所以我要加一個判斷,來判斷動態顯示前台模版和后台模版
怎么判斷呢???
首頁要判斷的話,肯定要有個東西來判斷的對吧?那這個東西哪里來呢?
肯定不能改路由,用url傳參判斷吧?那怎么怎么辦呢?
想來想去,只能中間件來傳參了。還是記得上面路由組里的中間嗎?!!!!
11)好,我們來加一個 adminview 中間件
php artisan make:middleware AdminView
記得中間件是需要在 app/Http/kernel.php 里注冊的,在 $routeMiddleware 數組后加上就行了
'adminview' => \App\Http\Middleware\AdminView::class,
中間件的內容如下:
<?php namespace App\Http\Middleware; use Closure; class AdminView { /** * Handle an incoming request. * * @param \Illuminate\Http\Request $request * @param \Closure $next * @return mixed */ public function handle($request, Closure $next) { $request->is_admin = true; return $next($request); } }
很明顯,我只是在請求模型里加一個 is_admin 屬性,並設置成 true
12)加完中間件后,上面的trait方法就要改一下了,判斷也很簡單,修改成下面這個樣子
public function showLoginForm(Request $request) { if ($request->is_admin) { return view('admin.auth.login'); }else{ return view('auth.login'); } }
public function showRegistrationForm(Request $request) { if ($request->is_admin) { return view('admin.auth.register'); } else { return view('auth.register'); } }
13)到此,添加后台用戶認證其實就已經弄好的了,你可以訪問 http://域名/admin/register 和 http://域名/admin/login 來測試注冊和登錄
14)最后一個,如果你成功登錄了后台,然后再訪問 /admin/register 或 /admin/login 的話,你會發現你跳走到 /home 里去了
照理來說登錄之后應該是要跳 /admin 的,而不是 /home 的,什么原來呢??
其實就是 LoginController 和 RegisterController 里的構造方法里都寫了使用一個叫 guest 的中間件,看一個 kernel.php,然后找到這個中間件的類在這里:
修改 RedirectIfAuthenticated 類的 handle 方法如下:
public function handle($request, Closure $next, $guard = null) { if (Auth::guard($guard)->check()) { if ($request->is_admin) { return redirect('/admin'); } else { return redirect('/home'); } } return $next($request); }
大功告成!!!
到此就真的大功告成了,這是我自己測試總結出來的,也不知道算不算是規范的寫法(因為我看laravel-admin等的cms的后台用戶認證的話不是這樣寫的,當然cms算了一個擴展應用,寫法肯定是我們直接寫是不同的)。
總之,如果你的項目要添加多一種用戶認證(后台管理員、商家會員等等),可以參考一下這個寫法哈哈哈哈哈!!!
PS:注冊和登錄的邏輯其實都不用怎么改,關鍵是要加一個 認證 “守衛”,然后 Admin 模型和 LoginController 控制器里聲明要使用這個 “守衛”就行了,我已經寫得比較詳細了,如果你剛好來到這里,認真看一下!我很少寫那么長的隨筆哈哈。