這些需求laravel 都幫你考慮到了!php
在conf/auth.php 中Guard 能夠配置 用戶和使用調用中間件(middleware)模式html
它解決了,不一樣客戶在不一樣環境下(api,web,admin) 使用不一樣用戶角色(前端用戶,後端用戶)權限認證需求前端
[ 'guards' => [ 'web' => [ //表示使用web中間件下 使用「session 驅動」 驅動位置:vendor\laravel\framework\src\Illuminate\Auth\SessionGuard.php //用戶爲users --具體定義users模型 在provider中定義 'driver' => 'session', 'provider' => 'users', ], 'api' => [ //表示使用api中間件下 使用「token 驅動」 //用戶爲users --具體定義users模型 在provider中定義
//注意api 沒有默認配置 Authenticate 中間件-------須要本身手動在 app/http/kernel.php 中添加 'driver' => 'token', 'provider' => 'users', 'hash' => false, ], 'admin' => [ //表示使用admin中間件下 使用「session 驅動」 //用戶爲admin --具體定義admin模型 在provider中定義 'driver' => 'session', 'provider' => 'admin', ], ] ]
順便講下用戶的數據提供者,它只是定義用戶類型,還有指定對應的用戶模型laravel
[ 'providers' => [ //表示users 用戶 使用App\User::class模型做爲用戶模型 'users' => [ 'driver' => 'eloquent', 'model' => App\User::class, ], //固然還能夠配置其餘用戶,好比admin 後臺用戶 'admin' => [ 'driver' => 'eloquent', 'model' => App\Admin::class, ], ] ]
Auth::guard('web')->user()
Auth::user();
注:默認配置在 config/auth.phpweb
'defaults' => [ 'guard' => 'web', 'passwords' => 'users', ]
若是是上面的配置,那auth::user() 就至關於 Auth::guard('web')->user();後端
中間件默認在 app\Http\Kernel.php 中註冊 有如下數組(規則):api
註冊在 $middleware 數組中的中間件 全部路由每次都會調用數組
protected $middleware = [ \App\Http\Middleware\TrustProxies::class, \Fruitcake\Cors\HandleCors::class, \App\Http\Middleware\CheckForMaintenanceMode::class, \Illuminate\Foundation\Http\Middleware\ValidatePostSize::class, \App\Http\Middleware\TrimStrings::class, \Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class, ];
註冊在 $middlewareGroups 數組中的中間件是路由組,一次調用別名其中的中間件都會調用(打包調用)session
protected $middlewareGroups = [ 'web' => [ \App\Http\Middleware\EncryptCookies::class, \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class, \Illuminate\Session\Middleware\StartSession::class, // \Illuminate\Session\Middleware\AuthenticateSession::class, \Illuminate\View\Middleware\ShareErrorsFromSession::class, \App\Http\Middleware\VerifyCsrfToken::class, \Illuminate\Routing\Middleware\SubstituteBindings::class, ], 'api' => [ 'throttle:60,1', \Illuminate\Routing\Middleware\SubstituteBindings::class, ], ];
protected $routeMiddleware = [ 'auth' => \App\Http\Middleware\Authenticate::class, 'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class, 'bindings' => \Illuminate\Routing\Middleware\SubstituteBindings::class, 'cache.headers' => \Illuminate\Http\Middleware\SetCacheHeaders::class, 'can' => \Illuminate\Auth\Middleware\Authorize::class, 'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class, 'password.confirm' => \Illuminate\Auth\Middleware\RequirePassword::class, 'signed' => \Illuminate\Routing\Middleware\ValidateSignature::class, 'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class, 'verified' => \Illuminate\Auth\Middleware\EnsureEmailIsVerified::class, ];
//經過auth中間件使用其中的 」admin guard」驗證中間件 Route::middleware('auth:admin')->get('/', function () { return view('welcome'); });
說明:auth:admin app
auth 中間件/其中的冒號表明傳參,參數爲 admin 就是在guard 中註冊的 admin 以下:
[ 'admin' => [ //表示使用admin中間件下 使用「session 驅動」 //用戶爲users --具體定義users模型 在provider中定義 'driver' => 'session', 'provider' => 'admin', ] ]
這個auth:admin表明:
我這個路由須要進行用戶認證:認證是否爲 admin 用戶,根據admin 守衛(guard)的配置,將會調用session模塊驗證用戶
laravel 權限認證,所有在Authenticate 中間件完成,默認文件在 \App\Http\Middleware\Authenticate.php
經過kernel (註冊於 App\Http\Kernel.php)注入到中間件模塊中
它經過guard 模塊來實現認證,guard在上面所說的config\auth.php 中註冊
在Authenticate 中使用了 guard 模塊來驗證用戶是否登陸:
如下代碼片斷位於:Illuminate\Auth\Middleware\Authenticate
class Authenticate implements AuthenticatesRequests { /** * The authentication factory instance. * * @var \Illuminate\Contracts\Auth\Factory */ protected $auth; /** * Create a new middleware instance. * * @param \Illuminate\Contracts\Auth\Factory $auth * @return void */ public function __construct(Auth $auth) { $this->auth = $auth; } //... }
當路由組件使用了「auth」 也就是 \App\Http\Middleware\Authenticate::class 中間件時就會觸發權限認證
以後的具體操做就有中間件來完成了,好比發現未登陸就跳轉到登陸頁
在 app/http/Kernel.php 中修改api 中間件的使用,由於默認admin guard 使用的session 驅動,全部須要打開 token,session 中間件的支持
protected $middlewareGroups = [ 'web' => [ \App\Http\Middleware\EncryptCookies::class,//啓用token 中間件 \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class, \Illuminate\Session\Middleware\StartSession::class,//啓用session 中間件 // \Illuminate\Session\Middleware\AuthenticateSession::class, \Illuminate\View\Middleware\ShareErrorsFromSession::class, \App\Http\Middleware\VerifyCsrfToken::class,//驗證csrf 中間件 \Illuminate\Routing\Middleware\SubstituteBindings::class, ], 'api' => [ \App\Http\Middleware\EncryptCookies::class,//新增的 啓用token \Illuminate\Session\Middleware\StartSession::class,//新增的 啓用session 中間件 \App\Http\Middleware\VerifyCsrfToken::class,//新增的 啓用csrf 中間件 'throttle:60,1', \Illuminate\Routing\Middleware\SubstituteBindings::class, ], ];
在路由界面添加須要的路由並在中間件中加上:"admin.auth" 表示使用 admin 權限驗證 就ok了
Route::middleware('admin.auth')->get('/company', function (Request $request) { return Company::select(['id',"name as text"])->get(); });
以上均爲我的總結,參考網上教程和laravel 相關源碼,若有錯誤和理解問題,歡迎大佬們指正!