1. 程式人生 > >Laravel-使用中介軟體做使用者認證和許可權管理

Laravel-使用中介軟體做使用者認證和許可權管理

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:

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);
    }
}
AdminMiddleware:
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');
    }