استفاده از Laravel Passport در حالت Multi Auth

11 ماه پیش توسط محمدرضا عطوان آپدیت شد
آفلاین
user-avatar
محمدرضا عطوان ( 9921 تجربه )
3 سال پیش

لینک کوتاه اشتراک گذاری

0

با سلام و احترام خدمت دوستان
با توجه به اینکه در لاراول با انجام تغییراتی میشه چند Auth برای پروژه ایجاد کرد، اما وقتی که بخوایم برای پنل هر کدومشون مثل ادمین و کاربر از vuejs و به دنبال اون از laravel passport استفاده کنیم با مشکل توسعه ی passport مواجه میشیم که اون مثلا فقط برای جدول user ها طراحی شده.
حالا میخواستم ببینم کسی از دوستان تا حالا به این مشکل برخورده؟
آیا فقط با افزودن مثلا admin_id و... در جداول پایگاه داده passport میشه از passport برای چند پنل استفاده کرد یا باید کار دیگه ای انججام بدیم؟
ممنونم

بهترین پاسخ
آفلاین
user-avatar

آسون ترین راه ممکن هیچ کار خاصی لازم نیست انجام بدین. اول باید توی config/auth.php بخش guards

'guards' => [
        'web' => [
            'driver' => 'session',
            'provider' => 'users',
        ],
 'api' => [
            'driver' => 'passport',
            'provider' => 'users',
            'hash' => false,
        ],

        'customers' => [
            'driver' => 'passport',
            'provider' => 'customers',
            'hash' => false,
        ],

    ], 

و در ادامه باید اون provider که معرفی انتخاب کردین در همین فایل config/auth.php معرفی کنید

 'providers' => [
        'users' => [
            'driver' => 'eloquent',
            'model' => App\User::class,
        ],
'customers' => [
            'driver' => 'eloquent',
            'model' => \App\Customer::class,
        ],
    ],  

حالا در مدل مورد نظر همون کاری که برای پاسپورت انجام دادین

namespace App;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;
use Laravel\Passport\HasApiTokens; 
class Customer extends Authenticatable
{
    use HasApiTokens, Notifiable;
.
.
.

حالا برای استفاده شما مثل این هست که یک middleware جدید ساختید به راحتی از اون استفاده کنید.

 Route::group(['middleware' => 'auth:customers'], function () {
    });

تموم شد. شما الان میتونید هرچند تا مدل خواستین برای passport استفاده کنید.

وقتی از

Auth::user() 

هم استفاده میکنید مدل مورد نظر رو برمیگردونه.

آفلاین
user-avatar
vahid Mohammadi ( 37202 تجربه )
3 سال پیش

لینک کوتاه اشتراک گذاری

0

@mratwan

سلام
اون مثلا فقط برای جدول user ها طراحی شده === این جمله درست نیست حالت پیش فرضش جدول userهست
آیا فقط با افزودن مثلا admin_id و... در جداول پایگاه داده passport میشه از passport برای چند پنل استفاده کرد == میشه ولی استاندارد نیست و زحمت شما رو بیشتر میکنه
باید کار دیگه ای انججام بدیم؟ === بله شما باید یک گارد و میدلور مخصوص برای admins درست کنید دقیقا مراحلی که لازم هست در مقاله زیر آورده شده

https://medium.freecodecamp.org/multiple-authentication-in-laravel-5-6-admin-and-user-3b3efe6da999
آفلاین
user-avatar
محمدرضا عطوان ( 9921 تجربه )
3 سال پیش

لینک کوتاه اشتراک گذاری

0

@viva.mohammadi عزیز
سلام
ممنونم به خاطر وقتی که گذاشتید
من کاملا با ساخت گارد و میدلور برای سطوح مختلف کاربر آشنایی دارم ولی با توجه به اینکه قابلیت passport به صورت پیشرض برای user ها هست، خواستم بدونم بعد از این که ما مراحل
https://medium.freecodecamp.org/multiple-authentication-in-laravel-5-6-admin-and-user-3b3efe6da999
رو انجام دادیم، برای passport چه کاری باید کرد؟
فرض کنید به این صورت

'admin' => [
            'driver' => 'session',
            'provider' => 'admins',
        ],

        'api-admin' => [
            'driver' => 'token',
            'provider' => 'admins',
        ],

ادمین ساختیم. حالا در جداول _oauth باید خودمون مثلا admin_id اضافه کنیم و یا باید دستی فایل های laravel passportرو در packege ش ادیت کنیم؟

آفلاین
user-avatar
vahid Mohammadi ( 37202 تجربه )
3 سال پیش

لینک کوتاه اشتراک گذاری

0

@mratwan
بیبینید من خیلی شاید منظورتون رو درست متوجه نشده باشم ولی کارهایی که خودم انجام دادم رو در زیر میارم
من یک کنترلر(adminController) در لاراول ایجاد کردم و در متد سازنده اش به شکل زیر عمل کردم

  public function __construct()
    {
        $this->middleware('auth:admin');
    }

از اینجا به بعد در هرجای کنترلرم من وقتی بخوام admin رو بشناسم از Auth::user() استفاده می کنم

آفلاین
user-avatar
محمدرضا عطوان ( 9921 تجربه )
3 سال پیش

لینک کوتاه اشتراک گذاری

0

@viva.mohammadi
شما کاملا درست می فرمایید ولی من منظورم اینه که وقتی بخوایم از لاراول پاسپورت استفاده کنیم id جدول ادمین با id جدول یوزر فرق میکنه و لاراول پارپورت در جداول oauth خودش که پس از نصبش در پایگاه داده ایجاد میکنه فقط فیلد user_id داره!
حالا میخوام ببینم اگر کسی در حالت مثلا روت api برای ارتباط با لاراول پاسپورت برای ادمینی که قبلا ایجاد کرده چطوری id ادمین رو با توجه به اینکه الان دیگه در جدول users نیست برای پاسپورت ثبت کرده؟

آفلاین
user-avatar
vahid Mohammadi ( 37202 تجربه )
3 سال پیش

لینک کوتاه اشتراک گذاری

2

@mratwan
امیدوارم پکیج زیر بتونه مشکلتون رو حل کنه

https://github.com/sfelix-martins/passport-multiauth
آفلاین
user-avatar
محمود مریدسادات زاده ( 520 تجربه )
11 ماه پیش
تخصص : laravel

لینک کوتاه اشتراک گذاری

0

آسون ترین راه ممکن هیچ کار خاصی لازم نیست انجام بدین. اول باید توی config/auth.php بخش guards

'guards' => [
        'web' => [
            'driver' => 'session',
            'provider' => 'users',
        ],
 'api' => [
            'driver' => 'passport',
            'provider' => 'users',
            'hash' => false,
        ],

        'customers' => [
            'driver' => 'passport',
            'provider' => 'customers',
            'hash' => false,
        ],

    ], 

و در ادامه باید اون provider که معرفی انتخاب کردین در همین فایل config/auth.php معرفی کنید

 'providers' => [
        'users' => [
            'driver' => 'eloquent',
            'model' => App\User::class,
        ],
'customers' => [
            'driver' => 'eloquent',
            'model' => \App\Customer::class,
        ],
    ],  

حالا در مدل مورد نظر همون کاری که برای پاسپورت انجام دادین

namespace App;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;
use Laravel\Passport\HasApiTokens; 
class Customer extends Authenticatable
{
    use HasApiTokens, Notifiable;
.
.
.

حالا برای استفاده شما مثل این هست که یک middleware جدید ساختید به راحتی از اون استفاده کنید.

 Route::group(['middleware' => 'auth:customers'], function () {
    });

تموم شد. شما الان میتونید هرچند تا مدل خواستین برای passport استفاده کنید.

وقتی از

Auth::user() 

هم استفاده میکنید مدل مورد نظر رو برمیگردونه.

برای ارسال پاسخ لازم است، ابتدا وارد سایت شوید.