摘要:服務端和端分離架構下使用進行前后臺用戶各自的認證前段時間大概一年以前寫了個項目使用了前后端代碼分離的架構,同時又因為業務需要出現了管理端和前臺商戶端兩套用戶表登陸的需求。
服務端和web端分離架構下使用 passport 進行前后臺用戶各自的認證
前段時間(大概一年以前)寫了個項目使用了前后端代碼分離的架構,同時又因為業務需要出現了管理端和前臺商戶端兩套用戶表登陸的需求。
因為使用了 passport 包做登陸認證,但是passport又不支持多用戶系統認證。所以那時候使用了一個中間表的方式去做認證,這種方式可以解決問題,但是太過復雜。
最近有個新的項目,又遇到了同樣的問題所以網上找了一下是否有簡單的解決方案,果然找到了一個輪子用sfelix-martins/passport-multiauth,使用它可以簡單的實現,前后臺分離架構下使用 passport 進行前后端用戶各自的認證。
這里要感謝下 Samuel Martins 為我們提供了這么優秀的輪子,目前已經更新到3.0版本。
具體的使用方法,其實看文檔基本已經很簡單了。不過這里還是簡單的寫一下我使用的過程。
在此之前,你需要看過使用 passport 的相關教程
1.引入 smartins/passport-multiauth
composer require smartins/passport-multiauth
2.遷移數據表 oauth_access_token_providers
php artisan migrate
3.在需要認證的模型內引入 HasMultiAuthApiTokens
use IlluminateNotificationsNotifiable; use IlluminateFoundationAuthUser as Authenticatable; use SMartinsPassportMultiauthHasMultiAuthApiTokens; class Admin extends Authenticatable { use Notifiable, HasMultiAuthApiTokens; }
4.在 config/auth.php providers 數組內增加對應的 provider
// ... "providers" => [ "users" => [ "driver" => "eloquent", "model" => AppUser::class, ], // ** New provider** "admins" => [ "driver" => "eloquent", "model" => AppAdmin::class, ], ],
5.在 config/auth.php guards 數組內增加對應的 guard
// ... "guards" => [ "web" => [ "driver" => "session", "provider" => "users", ], "api" => [ "driver" => "passport", "provider" => "users", ], // ** New guard ** "admin" => [ "driver" => "passport", "provider" => "admins", ], ], // ...
5.在 app/Http/Kernel.php 的 $routeMiddleware 數組內增加 AddCustomProvider 中間件。
class Kernel extends HttpKernel { // ... /** * The application"s route middleware. * * These middleware may be assigned to groups or used individually. * * @var array */ protected $routeMiddleware = [ // "auth" => IlluminateAuthMiddlewareAuthenticate::class, "auth" => SMartinsPassportMultiauthHttpMiddlewareMultiAuthenticate::class, "auth.basic" => IlluminateAuthMiddlewareAuthenticateWithBasicAuth::class, "bindings" => IlluminateRoutingMiddlewareSubstituteBindings::class, "can" => IlluminateAuthMiddlewareAuthorize::class, "guest" => AppHttpMiddlewareRedirectIfAuthenticated::class, "oauth.providers" => SMartinsPassportMultiauthHttpMiddlewareAddCustomProvider::class, "throttle" => IlluminateRoutingMiddlewareThrottleRequests::class, ]; // ... }
6.在 AuthServiceProvider 里面增加對應的路由
namespace AppProviders; use Route; use LaravelPassportPassport; use IlluminateSupportFacadesGate; use IlluminateFoundationSupportProvidersAuthServiceProvider as ServiceProvider; class AuthServiceProvider extends ServiceProvider { // ... /** * Register any authentication / authorization services. * * @return void */ public function boot() { $this->registerPolicies(); Passport::routes(); // Middleware `oauth.providers` middleware defined on $routeMiddleware above Route::group(["middleware" => "oauth.providers"], function () { Passport::routes(function ($router) { return $router->forAccessTokens(); }); }); } // ... }
7.運行 vendor:publish
php artisan vendor:publish --provider="SMartinsPassportMultiauthProvidersMultiauthServiceProvider"
8.在使用 oauth/token 認證的時候要增加 provider 字段
POST /oauth/token HTTP/1.1 Host: localhost Accept: application/json, text/plain, */* Content-Type: application/json;charset=UTF-8 Cache-Control: no-cache { "grant_type" : "refresh_token", "client_id": "client-id", "client_secret" : "client-secret", "refresh_token" : "refresh-token", "provider" : "admins" }
到此基本就可以進行多表的認證了。
在使用過程中遇到過一個小問題,因為我是先使用 passport ,在開發過程中為了方便直接把對應的 oauth_client 表是直接用 seeder 填充的,這也樣就省去了每次重置數據表的時候還需要再次運行 passport:install 去生成數據。當我使用 Personal Access Tokens 的時候會報一個錯誤
Trying to get property "client" of non-boject at >>>vendorlaravelpassportsrcClientRepository.php:81
這個問題是因為 oauth_personal_access_clients 表里面沒有數據,增加一條 oauth_personal_access_client 的數據就可以了
原文地址 : 服務端和web端分離架構下使用 passport 進行前后臺用戶各自的認證
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/29712.html
摘要:則是目前比較成熟的一套互聯網應用程序的設計理論。則允許操作,不一樣,報錯返回或者加入黑名單。再看下我們的數據庫中的用戶信息,值也被存入了進來,便于我們之后進行權限驗證。訪問同時將我們的值在中以傳入正確獲得用戶名則表示我們訪問請求通過了驗證。 showImg(https://segmentfault.com/img/remote/1460000008629635?w=800&h=534)...
摘要:則是目前比較成熟的一套互聯網應用程序的設計理論。則允許操作,不一樣,報錯返回或者加入黑名單。再看下我們的數據庫中的用戶信息,值也被存入了進來,便于我們之后進行權限驗證。訪問同時將我們的值在中以傳入正確獲得用戶名則表示我們訪問請求通過了驗證。 showImg(https://segmentfault.com/img/remote/1460000008629635?w=800&h=534)...
摘要:我所在的美團酒店事業部去年月份成立,新的業務新的開發團隊,這一切使得我們的前后端分離推進的很徹底。日志監控平臺日志監控平臺是美團內部的一個日志收集系統,目前美團統一使用收集日志,具有接收格式日志的能力,而日志監控平臺也是以格式日志來收集。 轉自:美團技術團隊 作者:美團技術團隊 分享理由:很好的分享,可見,基于Node的前后端分離的架構是越顯流行和重要,前端攻城獅們,No...
showImg(https://segmentfault.com/img/bV6aHV?w=1280&h=800); 社區優秀文章 Laravel 5.5+passport 放棄 dingo 開發 API 實戰,讓 API 開發更省心 - 自造車輪。 API 文檔神器 Swagger 介紹及在 PHP 項目中使用 - API 文檔撰寫方案 推薦 Laravel API 項目必須使用的 8 個...
摘要:微服務如何演變而來網關在微服務中如何發揮作用本文將以此作為話題,聊聊網關如何影響企業技術架構的演變。微服務之間相互獨立,使用者無需配置環境,直接調用即可完成開發。 互聯網技術日新月異,項目架構不斷升級優化。隨著企業微服務的興起和第三方API的發展,API網關這一作為微服務核心組件的產品也逐漸被越來越多的人認識。微服務如何演變而來?網關在微服務中如何發揮作用?本文將以此作為話題,聊聊AP...
閱讀 3186·2021-11-24 09:39
閱讀 2923·2021-11-23 09:51
閱讀 887·2021-11-18 10:07
閱讀 3544·2021-10-11 10:57
閱讀 2740·2021-10-08 10:04
閱讀 2999·2021-09-26 10:11
閱讀 1046·2021-09-23 11:21
閱讀 2780·2019-08-29 17:28