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
{
    /**
     * 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 中間件時就會觸發權限認證

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









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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章