Laravel-使用中介軟體做使用者認證和許可權管理
阿新 • • 發佈:2018-12-31
Laravel 中介軟體提供了一種方便的機制來過濾進入應用的 HTTP請求,例如,Laravel包含驗證使用者身份許可權的中介軟體。如果使用者沒有通過身份驗證,中介軟體會重定向到登入頁,引導使用者登入。反之,中介軟體將允許該請求繼續傳遞到應用程式。
當然,除了身份驗證以外,中介軟體還可以被用來執行各式各樣的任務,如:CORS中介軟體負責為所有即將離開應用的響應新增適當的頭資訊;日誌中介軟體可以記錄所有傳入應用的請求。
Laravel 已經內建了一些中介軟體,包括身份驗證、CSRF保護等。所有的中介軟體都放在app/Http/Middleware目錄內。
1、建立中介軟體
這裡要實現兩個過濾,一是隻允許管理員登入後臺(RoleMiddleware),二是隻有管理員使用者有許可權操作後臺(AdminMiddleware),
沒有通過驗證則跳回登入頁或者丟擲異常頁。建立命令:
[email protected]:~/Code/myblog$ php artisan make:middleware RoleMiddleware
Middleware created successfully.
[email protected]:~/Code/myblog$ php artisan make:middleware AdminMiddleware
Middleware created successfully.
RoleMiddleware:
AdminMiddleware:namespace App\Http\Middleware; use Closure; use App\Models\User; class RoleMiddleware { /** * 只允許管理員登入 */ public function handle($request, Closure $next) { if($request->input('email')){ $user = User::where('email',$request->input('email'))->first(); if ($user->is_admin != 1) { session()->flash('danger','您不是管理員'); return redirect('admin/login'); } } return $next($request); } }
namespace App\Http\Middleware; use Closure; use Illuminate\Support\Facades\Auth; class AdminMiddleware { /** * 只允許管理員操作 */ public function handle($request, Closure $next) { if(Auth::check()){ $user = Auth::user(); if ($user->is_admin != 1) { return abort(403); } } return $next($request); } }
2、註冊中介軟體,可以全域性註冊,也可以手動指定
這裡採用手動方式:
如果你想為特殊的路由指定中介軟體,首先應該在app/Http/Kernel.php檔案內為該中介軟體指定一個鍵值。
預設情況下Kernel類的$routeMiddleware屬性已經包含了 Laravel 內建的中介軟體條目。加入自定義的中介軟體,
只需把它附加到此列表並指定你定義的鍵值即可。例如:
protected $routeMiddleware = [
'auth' => \App\Http\Middleware\Authenticate::class,
'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
'role' => \App\Http\Middleware\RoleMiddleware::class,
'adminAuth' => \App\Http\Middleware\AdminMiddleware::class,
];
3、使用中介軟體,使用路由組為請求加上中介軟體
//後臺路由組
Route::group(['middleware' => 'adminAuth'], function () {
Route::get('/admin','[email protected]')->name('admin');
...
});
這裡可以加上多箇中間件名稱,也可以直接在類的構造方法中呼叫:
class ArticlesController extends Controller
{
public function __construct()
{
$this->middleware('auth');
}