Mohammad
3 سال پیش توسط Mohammad مطرح شد
3 پاسخ

کنترل سطح دسترسی کاربران با روت های کاملا مشابه

من روی یک پروژه ای کار میکنم که سه سطح کاربری به عنوان های ادمین، فروشنده و خریدار هست.برای تمام این کاربران یه تم واحد در نظر گرفته شده ولی برای هر کدوم از درسترسی ها یک نسخه با تغییرات متفاوت قرار داده ایم.روت های این سه دسته تقریبا 80 درصد مثل هم هست مثلا هر سه کاربر یک روت با ادرس "/dashboard" در نظر گرفته شده.
اگه توجه کرده باشین بالا گفتم که تمام کاربران با روت مشابه به داشبرد خود دسترسی دارند.
اگه بخوام بیشتر بگم مصلما همه جا دیدیم که مثلا میگند روت "/admin/dashboard" مخصوص داشبرد ادمین و بقیه دسترسی ها هم یه prefix قبل از "/dashboard" دارند. کاری که من میخوام اجرایی بکنم اینه که بجای این که با prefix داشبرد کاربران را جدا کنم از دیتابیس تایپ کاربران رو بخونم و روت های مخصوص به اون کاربر فقط براش قابل دسترس بشه.
حالا روش هایی که تست کردم رو میگم شاید با اون روش قابل انجام بوده ولی اشتباه از من بوده.

1) داخل فایل web.php یه شرط if قرار دادم و خواستم که باتوجه به تایپ کاربر روت هایی که مخصوص به اون کاربر هست رو اجازه دسترسی بدم.اوایل پروژه به صورت استاتیک شرط ها رو true میکردم تا یه ساختار کلی از پروژم بدست بیاد و در نظر داشتم که بعدا یک هلپری به پروژه اضافه میکنم و داخل اون هلپر با استفاده از Auth اطلاعات اون کاربری که لاراول قصد روتدهی داره رو بگیرم و تایپش رو برگردونم داخل اون if اگه بد توضیح دادم داخل عکس ها کدم رو میزارم :
web.php

عکس بالا عکس فایل روت web هست بالا هم توضیح دادم اول استاتیک بود بعد با هلپر تست کردم مشکل هلپر این بود که هلپر auth() ست نمیشد و null بر میگردوند و چیزی که متوجه شده هلپر auth() بعد از وریفای کارد روت ست میشه منظورم اینه که لاراول میاد تو web.php دنبال روت میگرده میره چک میکنه ویو، کنترولر یا هر چیز دیگه ای رو چک میکنه اگر اوکیه بعد auth() رو میره ست میکنم ولی من قبل از این چک کردن میخواستم از این هلپر استفاده کنم که موفق نبود این روش.
تست بعدیم این بود که یه میدلویر role بزارم روی تمام روت ها که تایپ کاربر رو مشخص کنه و داخل سشن ست کنه و من مقدار رو از سشن بگیرم و و داخل شرطم قرار بدم که این تست هم موفق نبود چون که ظاهرا میدلویر بعد از پیدا کردن روت روی روت اجرا میشه و من ایده ای که داشتم این بود که زمانی که به گروپ میدلور میرسه این میدلور اجرا میشه ولی این طور نبود.
منظور از پیدا کردن روت اینه که من روت هارو داخل if قرار دادم و زمانی که شرط true نشه اون بلاک شرط اجرا نمیشه و انگار که اون روت وجود نداره.

توضیح تصویر رو وارد کنید

ایده دومم این بود که با میدلویرها دسترسی هر کاربر رو به روت های مخصوص خودشون کنترل کنم
داخل میدلویر ها به متد auth() دسترسی داشتم ولی مشکل این بود که نتونستم شرط درستی داخل میدلویر اجرا کنم یا ممکنه که این کار بااین روش اجرایی نیست
من برای هر تایپ کاربرم یه گروپ روت درست کردم و روی هر سه گروپ میدلویر role را گزاشتم و بر اساس تایپ روت ها یه ورودی دادم و ایدم این بود که اگه داخل میدلویر شرطی که گزاشتم اوکی بود و true برگردوند به کاربر دسترسی بده.توضیح تصویر رو وارد کنید

عکس بالا فایل web.php هست

توضیح تصویر رو وارد کنید

این هم فایل میدلویرم که داخلش تایپ یوزر رو چک میکردم مشکل این روش این بود که شرطم درست کار نمیکرد و همیشه "/dashboard" گروت اخرم توی تایل روت ها اجرا میشد...

میدونم یکم زیاد توضیح دادم ولی خواستم اگه کسی یکم کمتر از لاراول میدونه متوجه بشه اومیدوارم که با توضیح زیادی گیج نشده باشین و ممنون میشم که تمام پیشنهادات و راه حل هاتون رو درمیون بزارید.
تشکر و عرض خسته نباشید به همگی بخصوص این اعضای این سایت :)


ثبت پرسش جدید
moha li
تخصص : توسعه دهنده لاراول و Vue
@mohaligateway 3 سال پیش آپدیت شد
0

سلام
شما با استفاده از بحث role و permission و به کار بردن ACL به سادگی می تونید همین کار ها را انجام دهید.
@mamadZirone


Mohammad
تخصص : برنامه نویس مبتدی لاراول
@mamadZirone 3 سال پیش مطرح شد
0

@mohaligateway خیلی ممنون از این که وقت گزاشتین و تا الان چیزی درباره این مواردی که گفتین نشنیدم و حتما به دنبال یادگیری این موارد میرم و سوالی که ازتون دارم این کاریکه من میخواستم انجام بدم اصلا با میدلویر ها قابل انجام هست؟من تا چه حدی از این روند رو درست رفتم.


moha li
تخصص : توسعه دهنده لاراول و Vue
@mohaligateway 3 سال پیش مطرح شد
0

بله اساس role و permission ها هم بر اساس middle هستش. شما یک middleware برای ادمین ایجاد می کنید و در route قرار میدید. و یک موضوع دیگری که کد شما رو نامنظم کرده و همواره باید در پروژه هاتون در نظر داشته باشید این هست که داخل web.php از دستورات مثل if کمتر استفاده کنید. با بزرگ شدن پروژه بهم ریختگی در کد ها به وجود میاد. در دوره های آموزشی همین سایت تمامی این موارد آموزش داده شده است.
@mamadZirone


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

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