- 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);就會看到使用者的資訊
複製程式碼