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

لاراول: اعمال خودکار دسترسی به کاربر

سلام دوستان وقت بخیر
من یک بخش roles و یک بخش permissions دارم که هر کدوم جداول واسط هم دارن یعنی اینجوری هست جداول من
roles
role_user
permissions
permission_user
permission_role
خب من ابتدا permissions ایجاد میکنم در پنلم .( مثلا delete , edit) سپس به بخش roles میرم و (,admin , editor) رو ایجاد میکنم که به اون permissions ها وصلش میکنم برای ایجاد کاربر جدید فیلد permissions و role رو اضافه میکنم خب تا اینجای کار اصلا مشکلی نیست و همه چی به خوبی کار میکنه اما میخوام در فرم ثبت نام فقط فیلد roles باشه چون مثلا admin رو انتخاب کنم خودکار به یوزر permissions رو بده
ممنون میشم راهنمایی کنید منو چطور میتونم با انتخاب roles در زمان ثبت نام کاربر جدید به صورت خودکار بر اساس role ها بهشون permission هم بدم یعنی سیستم تشخیص بده این role چه permission هایی داره

کنترلر من

    public function store(Request $request)
    {

        $data = $request->all();
        $user = User::create($data);
        if ($user && $user instanceof User) {
            $user->permissions()->attach($data['permissions']);
            $user->roles()->attach($data['roles']);
            return redirect()->back();
        }
    }

ثبت پرسش جدید
حسین شیری نژاد
تخصص : programmer
@hosseinshirinegad98 4 سال پیش مطرح شد
1

بله درسته شما باید رول بدی اما این امکان هم میتونه باشه که اونجا هم بتونی پرمیشن جدا بدی چون ممکنه یه پرمیشن بخوای بدی که تو اون رول های تعریف شدت نباشه که اگه هست نیاز نیست پرمیشن رو هم بدی. البته برای محکم کاری اونجا امکان دادن پرمیشن هم میزارن.
من حدس میزنم در کدتون شما هر بار فقط یه دونه رول میتونی در فرم انتخاب کنی که این میتونه تغیر کنه و همزمان چند تا رول بدی. (طبق آموزش لاراول آقای موسوی)
این روش کاری شما اشتباه است شما که در یک قسمتی از ادمین پنل اومدین به رولتون تعدادی پرمیشن دادین اینجا فقط دادن رول به کاربر کفایت میکنه چون اون رول خودش به تعدادی پرمیشن وصله و نمیخواد شما دوباره پرمیشن های اون رول رو بخونی و به یوزر بدی.فقط دادن رول کافیه.

روش کار شما در بالا به این صورت است که شما یه رول انتخاب میکنی فرمو با داده ای یوزر پر میکنی و ارسال میکنی ابتدا یوزر ساخته میشه بعد آیدی اون یه دونه رول رو به یوزر میدی بعد در ادامه میای تمام پرمیشن هایی اون رول رو میخونی و به یوز میدی. که اینجا خوندن رول و پرمیشن نیازی نیست.
و همین کد برای دادن رول و پرمیشن های اون رول به کاربر کافی هست. چون این رول از طریق رابطه به تعدادی پرمیشن وصله و دادن این رول به کاربر یعنی اینکه شما تمام پرمیشن هی وصل شده به این رول رو هم به یوزر دادی و نیاز به دادن مجدد این رول ها نیست و رابطه ها به همین درد میخورن.

public function store(Request $request)
    {

        $data = $request->all();
        $user = User::create($data);
        if ($user && $user instanceof User) {
            $id =$data['roles'];
            $user->roles()->attach($id);
            return redirect()->back();
        }
    }

نکته بعد اینکه شما میتونی در فرمت چندین رول رو انتخاب و ارسال کنی و چون ممکنه لازم باشه همون جا چند تا رول بخوای به کاربر بدی. چون رول ها زیادن و همه پرمیشن ها که نمیتونن مال یه رول باشن. پس لیست کشویی رول هارو چند انتخابه کنید و اسمشو به صورت roles[] دربیارین و در کدتون اینطوری تغییر بدین. یه شرط هم گذاشتم چون ممکنه هیچ رولی به کاربر داده نشه و برنامه ارور نده

 public function store(Request $request)
    {

        $data = $request->all();
        $user = User::create($data);
        if ($user && $user instanceof User) {
            if (isset($data['roles'])) {
                $user->roles()->attach($data['roles']);
            }

            return redirect()->back();
        }
    }

نیما
@shadecute3 4 سال پیش مطرح شد
0

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


حسین شیری نژاد
تخصص : programmer
@hosseinshirinegad98 4 سال پیش مطرح شد
0

من منظور شما رو درست متوجه نشده بودم فکر کردم شما فرم رجیستر بخش کاربری سایت رو میگین.
شما ابتدا باید پرمیشن تعریف کنی و بعد به هر رول تعدادی پرمیشن بدی در فرم ثبت نام یوزر؛ کافیه یه رول یا چند رول رو برای یوز انتخاب کنی همین دیگه کافیه و همه چی اوکی میشه و این دستور دیگه نیاز نیست

 $user->permissions()->attach($data['permissions']);

چون بین رول و پرمیشن ارتباط برقرار هست میتونی از طریق Gate پرمیشن ها یک کاربرو چک کنی که اگه فلان پرمیشنو داشت بهش اجازه دسترسی رو بده.


میلاد هدایت پور
تخصص : در حال پیشرفت
@miladparsi1070 4 سال پیش مطرح شد
-1

اگه از package‌استفاده کنید راحتترین
من از پکیج زیر استفاده کردم خوبه:
لاراول رول پرمیشن


نیما
@shadecute3 4 سال پیش آپدیت شد
0

@hosseinshirinegad98
ممنون دوست من از وقتی که گذاشتید و پاسخ دادید راستش من در پنل مدیریت یک فرم ایجاد یوزر از طریق ادمین ایجاد کردم اونجا دارم این کارو انجام میدم.
راستش من بر اساس آموزش آقای موسوی پیش رفتم
اینجا:

همه روابط بین جداول درسته و همه چی بدرستی کار میکنه و وقتی فیلد permissions رو از صفحه ویو و این کد رو از کنترلر

 $user->permissions()->attach($data['permissions']);

بر میدارم دیگه جدول
permission_user پر نمیشه که شامل permission_id user_id هست
--


حسین شیری نژاد
تخصص : programmer
@hosseinshirinegad98 4 سال پیش مطرح شد
0

خوب در فرم ایجاد کاربر شما بیا یه لیست کشویی برای رول ها بساز یکی هم برای پرمیشن ها و هر دو را به صورت آرایه دربیار و برای هر یوزر تعدادی رول یا پرمیشن انتخاب کن و بعد فرمو سابمیت کن ابتدا یوزرتو بساز و در ادامه با روش روابط چند به چند به هر یوزر تعدادی رول و پرمیشن بده این خیلی راحته.
اون کدهایی که نوشتی درسته و فقط فرمتو بر اساس رول ها و پرمیشن هایی که داری ایجاد کن.
تمام رول هارو بخون ودر یک لیست باکس بیارشون و برای پرمیشن ها هم این کارو بکن. اینجوری میتونی برای یه کاربر رول دلخواهتو انتخاب کنی یا براش پرمیشن دلخواهتو انتخاب کنی. مثل آب خوردن. خاصیت multiple لیست رو هم اضافه کن.


نیما
@shadecute3 4 سال پیش آپدیت شد
0

@hosseinshirinegad98
ممنون دوست من از وقتی که گذاشتی من بد سوالمو مطرح کردم یکم بد منظورمو متوجه شدید

خوب در فرم ایجاد کاربر شما بیا یه لیست کشویی برای رول ها بساز یکی هم برای پرمیشن ها و هر دو را به صورت آرایه دربیار و برای هر یوزر تعدادی رول یا پرمیشن انتخاب کن و بعد فرمو سابمیت کن ابتدا یوزرتو بساز و در ادامه با روش روابط چند به چند به هر یوزر تعدادی رول و پرمیشن بده این خیلی راحته.

دقیقا اینکارو انجام دادم کارم میکنه بدون مشکل اما من میگم وقتی من roles ساختم که که خودش شامل یک سری permission هست دیگه نباید بیام همزمان رول و پرمیشن بدم و فقط باید رول دادن به کاربر کفایت کنه .

حالا من کنترلم رو تغییر دادم و شد اون چیزی که میخواستم یعنی فقط رول به کاربر میدم خودش پرمیشن هم برای یوزر ثبت میشه و کار میکنه
اما آیا اینکاری که کردم منطقی هست و درسته نمی دونم چرا حس خوبی بهش ندارم😅
ممنون میشم دوستان منو راهنمایی کنید که آیا این دو خطی که به کنترلر اضافه کردم درسته و منطقیه هست؟
در کد زیر اون چند خطی که اضافه کردم با *** مشخص کردم ممنون میشم بررسی کنید

    public function store(Request $request)
    {

        $data = $request->all();
        $user = User::create($data);
        if ($user && $user instanceof User) {
            $id =$data['roles'];
      $user->roles()->attach($id);

***
            $permission =\App\Models\Role::where('id', $id)->first();
            $ًrole =  $permission->permissions;
            $user->permissions()->attach($role);

***
            return redirect()->back();
        }
    }

حسین شیری نژاد
تخصص : programmer
@hosseinshirinegad98 4 سال پیش مطرح شد
1

بله درسته شما باید رول بدی اما این امکان هم میتونه باشه که اونجا هم بتونی پرمیشن جدا بدی چون ممکنه یه پرمیشن بخوای بدی که تو اون رول های تعریف شدت نباشه که اگه هست نیاز نیست پرمیشن رو هم بدی. البته برای محکم کاری اونجا امکان دادن پرمیشن هم میزارن.
من حدس میزنم در کدتون شما هر بار فقط یه دونه رول میتونی در فرم انتخاب کنی که این میتونه تغیر کنه و همزمان چند تا رول بدی. (طبق آموزش لاراول آقای موسوی)
این روش کاری شما اشتباه است شما که در یک قسمتی از ادمین پنل اومدین به رولتون تعدادی پرمیشن دادین اینجا فقط دادن رول به کاربر کفایت میکنه چون اون رول خودش به تعدادی پرمیشن وصله و نمیخواد شما دوباره پرمیشن های اون رول رو بخونی و به یوزر بدی.فقط دادن رول کافیه.

روش کار شما در بالا به این صورت است که شما یه رول انتخاب میکنی فرمو با داده ای یوزر پر میکنی و ارسال میکنی ابتدا یوزر ساخته میشه بعد آیدی اون یه دونه رول رو به یوزر میدی بعد در ادامه میای تمام پرمیشن هایی اون رول رو میخونی و به یوز میدی. که اینجا خوندن رول و پرمیشن نیازی نیست.
و همین کد برای دادن رول و پرمیشن های اون رول به کاربر کافی هست. چون این رول از طریق رابطه به تعدادی پرمیشن وصله و دادن این رول به کاربر یعنی اینکه شما تمام پرمیشن هی وصل شده به این رول رو هم به یوزر دادی و نیاز به دادن مجدد این رول ها نیست و رابطه ها به همین درد میخورن.

public function store(Request $request)
    {

        $data = $request->all();
        $user = User::create($data);
        if ($user && $user instanceof User) {
            $id =$data['roles'];
            $user->roles()->attach($id);
            return redirect()->back();
        }
    }

نکته بعد اینکه شما میتونی در فرمت چندین رول رو انتخاب و ارسال کنی و چون ممکنه لازم باشه همون جا چند تا رول بخوای به کاربر بدی. چون رول ها زیادن و همه پرمیشن ها که نمیتونن مال یه رول باشن. پس لیست کشویی رول هارو چند انتخابه کنید و اسمشو به صورت roles[] دربیارین و در کدتون اینطوری تغییر بدین. یه شرط هم گذاشتم چون ممکنه هیچ رولی به کاربر داده نشه و برنامه ارور نده

 public function store(Request $request)
    {

        $data = $request->all();
        $user = User::create($data);
        if ($user && $user instanceof User) {
            if (isset($data['roles'])) {
                $user->roles()->attach($data['roles']);
            }

            return redirect()->back();
        }
    }

نیما
@shadecute3 4 سال پیش مطرح شد
1

سپاس دوست من از وقتی که گذاشتید کاملا متوجه شدم


حسین شیری نژاد
تخصص : programmer
@hosseinshirinegad98 4 سال پیش مطرح شد
1

خواهش میکنم.


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

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