Laravel 多使用者認證

南丞發表於2018-01-26
  • laravel 多使用者認證 架構

背景

專案包含若干子站點,不同站點功能各異,但共享底層資料及邏輯。公用同一個Auth 中介軟體來進行多使用者登入。用意是最大限度利用 Laravel 自帶的認證系統。不過預設的認證都是根據 『email』和『password』欄位進行的。之後有時間可能再追加自定義欄位比如『phone』的改造方案。

具體方案

專案按照不同站點組織成不同模組,在 Laravel 原有目錄結構基礎內,分別給各個站點創設目錄。

laravel 5.5 project
├── app
│   └── Http
│       └── Controllers
│           ├── Admin                  後臺目錄
│           │     ├── IndexController     
│           │     └── LoginController
│           ├── Home                   前臺目錄
│           │    └── IndexController
│           └── Auth                   laravel自帶的認證目錄     
└── resources
    └── views
        ├── admin
        ├── auth
        └── home

複製程式碼

本文以 Admin 為例進行說明,如需增加其他站點,進行類似改動即可。

上面的目錄是我們最終的目錄 其中 Auth 目錄 是通過 命令生成:

    php artisan make:auth
複製程式碼

執行命令以後就會生成一套許可權系統, 然後 開啟路由(web.php) 檔案 會看到:

Auth::routes();
Route::get('/home','HomeController@index')->middleware('auth');

複製程式碼

訪問 專案 /home 則會跳轉到 登入

接下來 我們 把這個路由改造一下, 首先改造路由:

Auth::routes();
Route::get('/','Home\IndexController@index')->middleware('auth');

複製程式碼

系統預設的是使用 emial 登入的 ,如果需要使用使用者名稱登入 則 需要開啟 :

上面所提到的Controller 下 Auth 目錄中的 LoginController.php 在裡面重寫:

public function username()
    {
        return 'name';
    }
複製程式碼

重寫跳轉

protected $redirectTo = '/';

複製程式碼

控制器寫完 接下來 修改一下 login 的頁面 英文的換 中文 就不說了

ok 上面修改完畢以後 我們把系統自帶的 認證當做 我們的前臺使用者的認證 接下來我們開始改造後臺認證

開始 自定義 guard

  • 開啟config中的 auth.php,程式碼如下:

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

        'api' => [
            'driver' => 'token',
            'provider' => 'users',
        ],
        //這個admin是自定義的guards  如果有多個認證 可以寫多個
        'admin' => [
            'driver' => 'session',   //這個是使用的驅動
            'provider' => 'admins',  //這個是你自定的  所對應的是下面的這個
        ],
    ],

    'providers' => [
        'users' => [
            'driver' => 'eloquent',
            'model' => App\User::class,
        ],
        //這個是定義的 providers
        'admins' => [
            'driver' => 'eloquent',
            'model' => App\Model\Admin::class, //這個是自定義的Modle類
        ]
    ]

複製程式碼

上面 App\Model\Admin::class 中的 Admin 是我 後臺使用者表 叫做 amdin

  • 開始建model類
php artisan make:model Model/Admin
複製程式碼

執行完畢,就會看到:


   laravel 5.5 project
    ├── app
         └──Model
             └──Admin.php

複製程式碼

其中 Admin.php 的程式碼內容是:


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

    class Admin extends Authenticatable
    {
        use Notifiable;


        protected $fillable = [
            'name', 'password',    //你要驗證的欄位
        ];

        /**
         * 陣列隱藏的屬性
         *
         * @var array
         */
        protected $hidden = [
            'password', 'remember_token',
        ];
    }
複製程式碼

寫完Model以後 重點開始 :

寫路由

/** 前端路由開始  ***/
Auth::routes();
Route::get('/','Home\IndexController@index')->middleware('auth');

/** 前端路由 結束 **/



/** 後臺登入 **/
Route::get('admin/login','Admin\LoginController@showLoginForm');
Route::get('admin/logout','Admin\LoginController@logout')->name('admin-logout');
Route::post('admin/login','Admin\LoginController@login')->name("admin-login");


/** 後臺路由 **/
Route::group(['prefix'=>'admin','middleware'=>'auth:admin'],function () {
   Route::get('/','Admin\IndexController@index');
});

複製程式碼

寫後端登入驗證:

上面路由中 我們看到 有 LoginController 控制器 所以 命令列走起:

    php artisan make:controller Admin/LoginController
複製程式碼

執行完畢以後 開啟: app/Http/controller/Admin/LoginController.php 開始寫驗證:程式碼是

<?php

namespace App\Http\Controllers\Admin;

use Illuminate\Http\Request;
use App\Http\Controllers\Controller;

class LoginController extends Controller
{
    // 展示後臺登入的頁面
    public function showLoginForm()
    {
        return view('admin.login');
    }

    //處理登入操作
    public function login(Request $request)
    {
        //auth('admin') 你自定義的grude  attempt(['要驗證的欄位'=>'傳送過來的值'])
        $res = auth('admin')->attempt(['name' => $request->get('name'), 'password' => $request->get('password')]);
        //返回 bool值
        if ($res) {
            return redirect('admin');
        } else {
            return redirect('admin/login');
        }
    }

    //退出
    public function logout()
    {
        auth('admin')->logout();
        return redirect('admin/login');
    }
}

複製程式碼

如上程式碼所示 登入成功以後 就可以通過redirect 跳轉

寫http請求處理:

找到Exceptions 目錄下的 Handler.php 檔案 重寫 下面方法:

<?php

protected function unauthenticated($request, AuthenticationException $exception)
    {
        if ($request->expectsJson()) {
            return response()->json(['error' => 'Unauthenticated.'], 401);
        }
        if(empty($exception->guards())){
            return redirect()->guest('login');
        }
        //中介軟體各模組之間跳轉問題
        return redirect()->guest($exception->guards()[0].'/login');
    }
複製程式碼

Ok 至此後臺登入也寫完畢了

在後臺首頁中如何如何獲取登入的使用者的資訊

$users = auth()->user();

dd($users);就會看到使用者的資訊
複製程式碼

相關文章