محمد حسین وفق
4 سال پیش توسط محمد حسین وفق مطرح شد
11 پاسخ

سطح دسترسی بدون role

باسلام و خسته نباشید بنده میخوام سطوح دسترسی برای مدیریتم ایجاد کنم اما میخوام از role استفاده نکنم به این شکل که من فقط جدول user و permission و یک جدول میانه permission_user دارم به چه طریقی هست در حال حاضر کاربر مدیر میتونه دسترسی مورد نیاز ایجاد کنه من یک مدیلور به اسم checkpermission دارم که میخواد چک کنه دسترسی کاربر داره یا نه ؟دوستانی که تجربه دارند ممنون میشم راهنمایی کنند


ثبت پرسش جدید
woz
تخصص : fan of open source world
@wozniak 4 سال پیش آپدیت شد
1

@mrvefgh
چند روش برای انجام اینکار وجود داره ( که هر دو از Best Practice ها هستند - اگر اشتباه میکنم دوستان منو اصلاح کنند) :
1 - روش اول استفاده از role و permissions است . که شما یه سری permission ایجاد می کنید و به هر رول یک یا چند پرمیشن ربط میدید. جهت مدیریت سطح دسترسیش هم می تونید از Gate ها و Policy ها استفاده کنید. که مثلا Gate ها رو داخل AuthServiceProvider ریجستر می کنید ( روش اینکار در همون Doc Laravel موجود هست ). حالا برای هر Routeی که دارید و یا برای هر قسمت از view هاتون می تونید از تابع can و مشتقات اون استفاده کنید ( رجوع شود به داکیومنت لاراول)
https://laravel.com/docs/7.x/authorization#gates
https://laravel.com/docs/7.x/authorization#authorizing-actions-using-policies
2 - روش دیگر استفاده از Guard های متفاوت هست. که در این روش هر کاربر شما یک گارد مخصوص به خود را دارد ( برای این مورد هم به داکیومنت laravel.com مراجعه کنید ). در این روش شما permission یا رول ندارید بلکه کل مسیر ها و داشبورد ها برای کاربران مختلف Hard Code می شود.
https://laravel.com/docs/7.x/authentication#adding-custom-guards


محمد حسین وفق
تخصص : پشتیبان وب سایت
@mrvefgh 4 سال پیش مطرح شد
0

ممنون از جوابتون بنده میخوام از روش اول استفاده کنم ولی تفاوت که داریم دیگه از role استفاده نمیکنیم و User و permssions با هم مستقیم در ارتباط لطفا اگر تجربه دارید کامل توضیح بدهید. @behzadd


محمد امیری
تخصص : backend coder
@mohammadeng3731 4 سال پیش آپدیت شد
1

سلام.
شما میتونید بدون استفاده از rule ها permission تعریف کنید و اینکار به سادگی درون لاراول با gate ها قابل اجرا است هرچند بهتره rule داشته باشید تا سمت های کاربران نیز مشخص باشد.

$permissions=permission:all();

foreach($permissions as $permission){

    Gate::define('$permission,function($user) use($permission){

            $userPermissions=$user->permissions->pluck('permission_name')->toArray();
            return in_array($permission->permission_name,$userPermissions);

        })

}

woz
تخصص : fan of open source world
@wozniak 4 سال پیش مطرح شد
0

@mrvefgh
این نحوه اجرا یک best practice نیست و بعدها به مشکل می خورید.
مثلا در این حالت برای هر کاربرتون که جدیدا به تیم اضافه میشه باید permission های مورد نظر رو دوباره بهش ربط بدین. تصور کنید یدونه app معمولی بیشتر از 30 تا permission می تونه داشته باشه(بسته به پروژه شاید بیشتر). و در ضمن اگر شما در این مجموعه آپدیتی دارشته باشید در آینده می تونه کل پروژه رو به چالش بکشه. والا هیچ محدودیتی در نحوه پیاده سازی به شکلی که فرمودید وجود نداره و کاملا اجرایی هست.


محمد امیری
تخصص : backend coder
@mohammadeng3731 4 سال پیش مطرح شد
0

@behzadd موافقم اینکار کلا مشکل ایجاد میکنه


محمد حسین وفق
تخصص : پشتیبان وب سایت
@mrvefgh 4 سال پیش مطرح شد
0

این پروژه کوچک و crm هست میخوام خیلی ساده باشه نمیدونم داخل میدولور چی تعریف کنم و در کلاس user مدل چه فانکشن های تعریف کنم تا این خیلی ساده با ی میدلور و چند تا فانکشن اجرا کنه ممنون میشم که منو راهنمایی کنید @behzadd @mohammadeng3731


woz
تخصص : fan of open source world
@wozniak 4 سال پیش مطرح شد
0

@mrvefgh
جهت کنترل سطح دسترسی یک middleware نمیتونه کارهارو براتون راه بندازه و اگر اصرار دارید از middleware استفاده کنید باید تعداد بیشتری استفاده کنید و یا middleware های پیچیده طراحی کنید. که مطمئنا جالب نیست. پس برای قسمت کنترل سطح دسترسیتون (ACL) باید از همون gate ها استفاده کنید روش بهتریه.

در مورد توابعی که نیاز دارید ، خدمتتون عرض کنم که یک پروژه کامل هست همین مطلبی که می فرمایید شاید نشه اینجا به طور کامل بیان کرد. من به صورت کلی عرض میکنم :
۱ - اولا شما باید دیتابیستون اگر طراحی نشده رو طراحی اولیه کنید، users . permissions , user_permissions نیاز خواهید داشت ( طبق طراحی خودتون). که اگر از relation های لاراول استفاده می کنید یک ریلیشن oneToMany دارید داخل users. و belongsTo داخل permissions و داخل جدول user_permissions هم دوتا foreign key شامل user_id , permission_id تمام.این دیتا بیس شما
۲ - حالا بقیه موارد مربوط به طراحی ACL هست که باید gate ها رو از روی permissions هایی که دارید بسازید.
۳ - حالا استفاده از اینها و یه قسمت از برنامتون مربوط به مدیریت خود سطح دسترسی ها باید باشه. ( اینکه چه یوزری چه پرمیشنی داشته باشه )‌ و یه قسمت هم استفاده از permission هایی که ساختید ( مثلا یوزری که permission داره برای ساخت پست جدید فقط بتونه دسترسی به مسیر /post/create داشته باشه )‌که اینجا خیلی از middleware ها به صورت gate استفاده خواهید کرد.مانند مثال زیر :

Route::get('/post/create', 'PostController@create')->middleware('can:create_post');

در کل اگر زمان کمی دارید عاقلانه ترین کار اینه که از پکیج های آماده نقش گذاری در لاراول استفاده کنید.


محمد حسین وفق
تخصص : پشتیبان وب سایت
@mrvefgh 4 سال پیش مطرح شد
0

سلام مورد یک ساختم مورد دو به چه شکل هست بیشتر توضیح می دهید
حالا بقیه موارد مربوط به طراحی ACL هست که باید gate ها رو از روی permissions هایی که دارید بسازید.
@behzadd


محمد امیری
تخصص : backend coder
@mohammadeng3731 4 سال پیش آپدیت شد
0

خب مثل اینکه اصرار دارید از این middleware ها استفاده کنید.روش کار سادست.ابتدا یک middleware ایجاد کنید و یک ورودی برای permission مورد نظر قرار دهید. مثل کد زیر :

   public function handle($request, Closure $next, $permission)
    {
        if (auth()->check()) {
            $userPermissions = auth()->user()->permissions->pluck('permission_name')->toArray();
            if (in_array($permission, $userPermissions)) {
                return $next($request);
            } else {
                abort(401);
            }
        }
        abort(401);

    }

حالا در روت مورد نظر باید به صورت زیر عمل کنید:

Route::get('/edit-comments','editCommentController@edit')->middleware('yourMiddleware:yorPermissionName');

woz
تخصص : fan of open source world
@wozniak 4 سال پیش مطرح شد
0

@mrvefgh
دوست عزیزمون @mohammadeng3731 اشاره فرمودن که چجوری Gate ها رو داخل AuthServiceProvider تون ریجستر کنید. این قسمت رو حتما به داکیومنت لاراول سر بزنید + یکم از ذوق برنامه نویسی :
https://laravel.com/docs/7.x/authorization#gates


محمد حسین وفق
تخصص : پشتیبان وب سایت
@mrvefgh 4 سال پیش مطرح شد
0

سلام ممنون از دوستان من لینک بررسی میکنم


برای ارسال پاسخ لازم است وارد شده یا ثبت‌نام کنید

ورود یا ثبت‌نام