اذهب إلى المحتوى
  • 0

كيفية استخدام Laravel Passport Scopes

Amir Alsaeed

السؤال

لدي user model و جدول خاص به، كيف يمكنني تخصيص صلاحيات لأنماط مختلفة من المستخدمين مثل user, admin, customer باستخدام Passport. فلدي التطبيق مبني باستخدام vue js وعند التحقق من المستخدم وتسجيل الدخول لا يتم منح الصلاحيات المحددة له. 

 Passport::tokensCan([
        'user' => 'User',
        'customer' => 'Customer',
        'admin' => 'Admin',
    ]);

وهل scopes في باسبورت مختلفة عن roles في لارافيل؟

رابط هذا التعليق
شارك على الشبكات الإجتماعية

Recommended Posts

  • 1

إن الفرق الأساسي بينهما هو في طريقة استخدامهما. فاستخدام roles هو عند الاتصال المباشر مع التطبيق، أما Oauth-2 أو scopes يغطي الوصول إلى مصادر API لمستخدم خارجي بالنيابة عن المستخدم المباشر.

لتطبيق ذلك يجب أولاً تهئية مكتبة laravel/passport بالشكل الصحيح من التوثيق الرسمي باتباع الخطوات. ثم يجب تعريف ال scopes بشكل مفصّل بحيث يتم ذكر كافة الصلاحيات التي سيتم استخدامها،

ففي ملف AuthServiceProvider نقوم بكتابة التالي:


Passport::tokensCan([
    'manage-order' => 'Manage order scope'
    'read-only-order' => 'Read only order scope'
]);

ثم نقوم بكتابة ملف المتحكم الخاص بالتوثيق:

namespace App\Http\Controllers;

class OrderController extends Controller
{   
    public function index(Request $request)
    {
        
    }

    public function store(Request $request)
    {
        // عملية مخصصة للمدير
    }

    public function show($id)
    {
        // الإظهار للمدير والمستخدم العادي
    }
}

ثم في ملف api نقوم بتعريف الموجهات مع استخدام auth المناسب لها:

Route::get('/api/orders', 'OrderController@index')
    ->middleware(['auth:api', 'scopes:manage-order']);
Route::post('/api/orders', 'OrderController@store')
    ->middleware(['auth:api', 'scopes:manage-order']);
Route::get('/api/orders/{id}', 'OrderController@show')
    ->middleware(['auth:api', 'scopes:manage-order, read-only-order']);

حيث نقوم بتمرير 'scopes:manage-order, read-only-order' حسب الصلاحيات التي قمنا بتعريفها في الباسبورت

وأيضاً، لإصدار token للمستخدم، يجب أولاً التحقق من صلاحيات هذا المستخدم ولتنفيذ ذلك نحتاج متحكم إضافي كالتالي:

namespace App\Http\Controllers\Auth;

use App\Http\Controllers\Controller;
use Illuminate\Foundation\Auth\AuthenticatesUsers;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Route;

class ApiLoginController extends Controller
{
    use AuthenticatesUsers;

    protected function authenticated(Request $request, $user)
    {               
        // التحقق من صلاحيات المستخدم من قاعدة البيانات
        $role = $user->checkRole();

        // إعطاء scope تبعاً لصلاحيات المستخدم
        if ($role == 'admin') {
            $request->request->add([
                'scope' => 'manage-order' // grant manage order scope للمدير
            ]);
        } else {
            $request->request->add([
                'scope' => 'read-only-order' // read-only order scope للمستخدم
            ]);
        }

        // تحويل الطلب إلى oauth
        $tokenRequest = Request::create(
            '/oauth/token',
            'post'
        );
        return Route::dispatch($tokenRequest);
    }
}

أخيراً، نقوم بتوجيه المستخدم عندما يقوم بتسجيل الدخول إلى هذا المتحكم كالتالي:

Route::group('namespace' => 'Auth', function () {
    Route::post('login', 'ApiLoginController@login');
});

 

رابط هذا التعليق
شارك على الشبكات الإجتماعية

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...