laravel 5.3 多用戶認證


 不知道對不對,亂來一下!!!!

 

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']),
        ]);
    }
}
View Code

 

好了,再說一下 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');
    }
}
View Code

 

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 控制器里聲明要使用這個 “守衛”就行了,我已經寫得比較詳細了,如果你剛好來到這里,認真看一下!我很少寫那么長的隨筆哈哈。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM