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

راهنمایی در خصوص ریدایرکت کاربر بعد از لاگین

باسلام
موقع لاگین کاربر، چگونه میتوان بررسی کرد که اگر کاربر مدیر هست به این روت ارجاع داده شود

panel/admin/dashboard/

در غیر این صورت به مسیر

panel/user/dashboard/

ارجاع داده شود.


ثبت پرسش جدید
Seyyed Mojtaba Hoseyni
تخصص : برنامه نویس Laravel و ReactJS
@SMH118 4 سال پیش مطرح شد
2

سلام
داخل کلاس LoginController یک متدی وجود داره به نام authenticated که میتونید اون رو override کنید.
این متد زمانی اجرا میشه که عملیات login کردن کاربر با موفقیت انجام بشه
حالا شما میتونید داخل این متد برسی کنید که اگر نوع کاربر ادمین بود، کاربر رو redirect کنه به صفحه مورد نظر.
مثال:

protected function authenticated(Request $request, $user)
{
   if($user->role=="admin")
        return redirect("Admin Route");
    return redirect("User Route");
}

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

سلام
از نظر من:
بستگی به جدولی که داری سشن برای ادمین مشخص میکنی اگر سشن ست شد ریدایرکت کن


سیدعلی موسوی
تخصص : سی شارپ و پی اچ پی
@juza66 4 سال پیش آپدیت شد
1

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


Seyyed Mojtaba Hoseyni
تخصص : برنامه نویس Laravel و ReactJS
@SMH118 4 سال پیش مطرح شد
2

سلام
داخل کلاس LoginController یک متدی وجود داره به نام authenticated که میتونید اون رو override کنید.
این متد زمانی اجرا میشه که عملیات login کردن کاربر با موفقیت انجام بشه
حالا شما میتونید داخل این متد برسی کنید که اگر نوع کاربر ادمین بود، کاربر رو redirect کنه به صفحه مورد نظر.
مثال:

protected function authenticated(Request $request, $user)
{
   if($user->role=="admin")
        return redirect("Admin Route");
    return redirect("User Route");
}

محمد نمازی
تخصص : توسعه دهنده وب
@mnamazi 4 سال پیش مطرح شد
0

@SMH118

به جز این روش، راه دیگه که حرفه ای تر باشه وجود داره ؟

یه متغیر داریم به اسم

    protected $redirectTo = RouteServiceProvider::HOME;

اینرو هم باید کامنت کنم که با اون تابع قاطی نکنه ؟


Seyyed Mojtaba Hoseyni
تخصص : برنامه نویس Laravel و ReactJS
@SMH118 4 سال پیش آپدیت شد
1

@mnamazi
چون دارید از سیسم لاگین خود لاراول استفاده میکنید، راه دیگه ای نیست.
وارد کلاس LoginController بشید. داخل این کلاس از یک trait ای استفاده شده به نام AuthenticatesUsers. واردش بشید و دنبال متد sendLoginResponse بگردید. این متد وظیفه برگردوندن response به کاربر بعد از login رو داره که اگر دقت کنید داخل یک شرطی از همون متد authenticated استفاده کرده که به صورت پیش فرض خالی هستش و کدی در این متد نوشته نشده. اگر این متد خروجی falseیا null برگردونه از متغیر $redirectTo برای پاسخ استفاده میکنه در غیر اینصورت خروجی متد authenticated رو به عنوان response در نظر میگیره.
منظور من از این توضیحات این بود که خود لاراول این متد رو برای ما قرار داده که بعد از login کاربر، بتونیم عملیات مختلفی رو انجام بدیم. بنابر این در استفاده کردن از این متد نگران نباشید و راه خیلی خوبی هم هستش.
ولی بله، اگر شما فقط یه route ثابت داشتید میتونستید فقط مقدار اون $redirectTo رو تغییر بدین که کاربر بعد از login به اون route بره.


محمد نمازی
تخصص : توسعه دهنده وب
@mnamazi 4 سال پیش مطرح شد
0

@SMH118

درود

یه مشکلی واسم پیش اومده، اینکه وقتی که از پنل مدیریت از روت ادمین به روت کاربر میرم، با اینکه دسترسی ادمین دارم اما فقط روت های کاربر رو بهم نشون میده. مشکلم از کجا میتونه باشه !!؟


سبحان دادخواه
تخصص : دانشجوی برنامه نویسی :)
@SobhanDadkhah 4 سال پیش مطرح شد
1

با سلام . شما توی LoginController اومدین مشخص کردین اگر کاربر ادمین هست به روت خودش منتقل بشه اگر یوزر به روت خودش . خوب همون روش رو باید برای هرجایی که مربوط به پنل هست و تفاوتی بین ادمین و کاربر قائل میشید پیاده کنید . مثلا توی کنترلر UserController توی متدی که صفحه پنل کاربری رو به کاربر عادی نمایش میدین دوباره باید همون شرط ادمین بودن یا نبودن رو چک کنید و اگر ادمین بود ریدایرکت کنید . البته به نظرم راجب Middleware ها توی لاراول مطالعه کنید و درصورت امکان با Middleware پیاده سازی کنید .داکیومنت میدلور لاراول

امیدوارم مشکلتون همین چیزی بوده باشه که من متوجه شدم . موفق باشید


محمد نمازی
تخصص : توسعه دهنده وب
@mnamazi 4 سال پیش مطرح شد
0

@SobhanDadkhah
@SMH118

سلام،
ببینید تنها جایی که چک میکنم که بین روت مدیر و کاربر ارجاع داده بشه، همین تابع authenticated که دوستمون @SMH118 راهنمایی کردن، هست و مابقی فقط بحث پرمیشن و رول هست که میگه این گروه superadmin همه دسترسی هارو داره و مابقی گروه ها به عنوان کاربر شناخته میشوند.

  • سوال ۱ : این مشکل هنوز برطرف نشده و اگر مدیر به روت کاربر بره، تمام دسترسی هاش هم از بین میره !!
  • سوال ۲ : بنظرشما اصلا نیازی هست که روت کاربر با user شروع بشه و مدیر با admin ؟ فلن این کار برای من جنبه ی نمایشی داره و نمیدونم کجا بدردم میخوره و چه فایده ای داره !!

سبحان دادخواه
تخصص : دانشجوی برنامه نویسی :)
@SobhanDadkhah 4 سال پیش مطرح شد
1

@mnamazi
باسلام.
بحث پرمیشن و رول برای سطوح دسترسی هست که مثلا نویسنده سایت به چه مواردی دسترسی داشته باشه و اینجور داستان ها که برای ایجاد دسترسی های مختلف توی پنل ادمین به کار میاد.
اما راجب سوال اصلی شما : شما اگر یدونه پنل دارین یعنی قالب یک تک پنل طراحی کردین و میخواین همه کاربران از اون استفاده کنن میتونید فقط از پرمیشن و رول ها استفاده کنید مثلا تمامی کاربران بعد از لاگین کردن به روت dashboard ارسال بشن و اونجا پنلتون تمامی موارد چه برای کاربر چه برای مدیر رو داشته باشه و بگین اگر کاربر ادمین بود تمامی منو ها نمایش داده بشه اگر نویسنده بود ارسال مقالات نمایش داده بشه ، اگر کاربر عادی بود مثلا فقط ثبت سفارش نمایش داده بشه و به همین ترتیب پرمیشن بذارین اما کار عاقلانه ای نیست به نظرم و اینکه الان دو روت و دو پنل جدا دارین کاملا استاندارد هست .
موردی که هست همونطوری که دوستمون گفتن با متدی که شما ست کردین بعد از لاگین کردن چک میکنید اگر کاربر ادمین بود به روت admin/dashboard ارسال میشه اگر یوزر بود به روت user/dashboard . اینجا باید این سوالو برای خودتون مطرح کنید که اگر کاربر عادی وارد روت خودش بشه و بعد بصورت دستی بخواد به روت admin/dasboard دسترسی پیدا کنه اجازه چنین کاری رو داره ؟ قاعدتا شما باید اینجا جلوی این کار رو بگیرین که فرضا کاربر عادی زمانی که خواست روت admin/dashboard رو فراخوانی کنه یا بهش بگین چنین صفحه ای وجود نداره (برای امنیت بیشتر ) یا اینکه توی کنترلر مربوطه داخل متدی که پنل ادمین رو نمایش میده باید چک کنید که کاربر جاری آیا رول ادمین رو داره یا خیر ؟ اگر یوزر بود ریدایرکت کنید به همون داشبورد مربوط به کاربر عادی.(به همین دلیل راجب سوال 1 داخل سیستم شما ادمین وقتی روت کاربر رو فراخوانی میکنه بجای اینکه به پنل خودش منتقل بشه به پنل عادی کاربران سایت منتقل میشه و قاعدتا دسترسی های پنل ادمین رو نداره)
اینجاست که اهمیت استفاده از Middleware ها مشخص میشه . شما میتونید یک میدلور کاستوم برای خودتون بسازید ، این شروط ادمین بودن یا نبودن رو داخلش چک کنید و توی فایل routes.php اون میدلور خودتون رو روی هر روتی که نیاز به احراز هویت داره (مثل روت های مربوط به ادمین) صدا بزنید . چرا ؟ چون خیلی کد خلوت تر و خوانا تری خواهید داشت نسبت به زمانیکه توی تک تک متدهای کنترلر های مربوط به ادمین بخواین دائما چک کنید آیا کاربر ادمین هست یا خیر.
کمی طولانی شد ولی خواستم کاملا واضح توضیح داده باشم . اگر توی پیاده سازی باز هم موردی بود قطعا بیان کنید چه من چه دوستان در حد توان راهنمایی خواهیم کرد
موفق باشید


محمد نمازی
تخصص : توسعه دهنده وب
@mnamazi 4 سال پیش مطرح شد
0

@SobhanDadkhah

خیلی ممنونم بابت توضیحات کاملتون و وقتی که برای پاسخ به سوال بنده گذاشتید.
راستش تمامی مواردی که مطرح کردید رو رعایت کردم و مشکلی بابت اونها ندارم فقط من یه اشتباهی کردم و اینکه داخل پنل ادمین و یوزر یه روت هایی دارم که مربوط به کاربر می شود ( روت panel/user/profile) مانند بروزرسانی اطلاعات پروفایل یا ارسال تیکت پشتیبانی. که بنده اینهارو داخل پنل مدیریت هم قرار دادم چون مدیر هم برای خودش یه پروفایلی دارد و یا میتواند تیکتی بااسم خودش ارسال کند که اینها همگی از روت panel/user/... استفاده میکنند، در اینجا نمیدانم اصول کار درست هست یا خیر ؟ اگر صحیح نیست پیشنهادتون چی هست ؟


سبحان دادخواه
تخصص : دانشجوی برنامه نویسی :)
@SobhanDadkhah 4 سال پیش مطرح شد
1

@mnamazi
قاعدتا نباید به اینصورت باشه . نه اینکه امکان انجامش نباشه ولی خوانایی در کد نویسی و اپلیکیشن هم مهمه .
به نظرم بهتره روت هایی مخصوص خودشون داشته باشن اما این بستگی به منطق برنامه شما هم داره . مثلا بستگی به طراحی دیتابیس داره . اگر توی جدول تیکت هاتون ستونی دارید که مشخص میکنه این تیکت توسط چه کاربری ارسال شده یا یه نوع رابطه ای برقرار کردین که این مورد رو پوشش میده فک نمیکنم مشکلی باشه که از روش خودتون هندل کنید.ولی برای بهتر شدنش بیاین و یک روت خاص مشخص کنید مخصوص ثبت تیکت (خوانایی رو بالا میبره و منطق قشنگ تری به برنامتون میده) .مثلا بجای اینکه روت به این شکل باشه user/ticket شما بیاین و یک روت کلی برای هر نوع کاربر داشته باشید مثلا support/ticket و تمامی موارد مربوط به یک تیکت رو به کنترلر خودش منتقل کنید فرضا TicketManagementController و اونجا توی ایجاد تیکت جدید مشخص کنید که این تیکت متعلق به کاربر هست یا ادمین . چون منطق دقیق و ساختار دیتابیس برنامتون رو نمیدونم صرفا یک مثالی زدم .
ویدیو های jeffrey way رو اگر مشاهده کرده باشین میبینید که نمیاد خرید اشتراک رو توی همون کنترلر مربوط به یوزر انجام بده و یک کنترلر مربوط و همچنین روت های مخصوص به خودش رو میسازه که خوانایی برنامه بشدت بالا میره . البته لزومی بر پیروی از این قانون نیست ولی چیزیه ک فردی مثل جفری انجام میده و قطعا دلایل خوبی هم برای اینکار داره .
وقت گذاشتن برای پاسخ به دیگران قطعا باعث پیشرفت خودمون هم میشه :D
موفق باشید


محمد نمازی
تخصص : توسعه دهنده وب
@mnamazi 4 سال پیش مطرح شد
0

خیلی لطف کردید
در صورت امکان، ممنون میشم ای دی تلگرامتون رو ارسال نمایید.


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

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