天天看點

Laravel admin 調用api時驗證使用者,Laravel guard 正...

1.你的應用可能:分為前端使用者和後端管理使用者。

  2.你的應用可能:既是傳統php渲染的html 應用,同時也為其他應用(如:安卓手機應用)提供api接口服務。

  這些需求laravel 都幫你考慮到了!

  在conf/auth.php 中Guard 可以配置 使用者和使用調用中間件(middleware)模式

  它解決了,不同客戶在不同環境下(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 驅動”

            //使用者為users --具體定義users模型 在provider中定義

            'driver'   => 'session',

            'provider' => 'admin',

        ],

    ]

]

順便講下使用者的資料提供者,它隻是定義使用者類型,還有指定對應的使用者模型

[

    'providers' => [

        //表示users 使用者 使用App\User::class模型作為使用者模型

        'users' => [

            'driver' => 'eloquent',

            'model' => App\User::class,

        ],

        //當然還可以配置其他使用者,比如admin 背景使用者

        'admin' => [

            'driver' => 'eloquent',

            'model' => App\Admin::class,

        ],

    ]

]

2|0使用守衛(Guard)方法

2|1指定guard,擷取目前會話使用者資訊

Auth::guard('web')->user()

2|2使用預設 guard,擷取目前會話登入資訊

Auth::user();

注:預設配置在 config/auth.php

'defaults' => [

    'guard' => 'web',

    'passwords' => 'users',

]

如果是上面的配置,那auth::user() 就相當于 Auth::guard('web')->user();

3|0如何在路由中使用 權限認證?

3|11.首先要了解 laravel 中間件使用方法:

中間件預設在 app\Http\Kernel.php 中注冊 有以下數組(規則):

注冊在 $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 數組中的中間件是路由組,一次調用别名其中的中間件都會調用(打包調用)

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,

    ],

];

注冊在 $routeMiddleware 數組可以單獨使用,也可以配合middlewareGroups  一起使用

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,

];

3|2路由使用使用者認證方法(使用預設的auth 中間件方法)

//通過auth中間件使用其中的 ”admin guard”驗證中間件

Route::middleware('auth:admin')->get('/', function () {

    return view('welcome');

});

說明:auth:admin

auth 中間件/其中的冒号代表傳參,參數為 admin 就是在guard 中注冊的 admin 如下:

[

    'admin' => [

        //表示使用admin中間件下 使用“session 驅動”

        //使用者為users --具體定義users模型 在provider中定義

        'driver'   => 'session',

        'provider' => 'admin',

    ]

]

這個auth:admin代表:

我這個路由需要進行使用者認證:認證是否為 admin 使用者,根據admin 守衛(guard)的配置,将會調用session子產品驗證使用者

4|0Laravel Authenticate認證流程

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

{

    protected $auth;

    public function __construct(Auth $auth)

    {

        $this->auth = $auth;

    }

    //...

}

當路由元件使用了“auth” 也就是   \App\Http\Middleware\Authenticate::class 中間件時就會觸發權限認證

之後的具體操作就有中間件來完成了,比如發現未登入就跳轉到登入頁

5|0實戰:Laravel-Admin 調用查詢接口,不允許未登入使用者通路api

在 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();

});