سلام دوستان...
توی لاراول برای هر نوع یوزر یه گارد مخصوص دارم.. کاربر عادی و ادمین..
دوتا جدول متفاوت دارن و لاگین هردوشون هم درست کار میکنه..
ببینید آدرس لاگینشون اینطوریه
کاربر عادی
/login
ادمین
/admin/login
حالا مشکلی که هست وقتی کاربر عادی لاگین میشه بعدش علاوه بر این که در حالتی که لاگینم، اگر بخوام به فرم لاگین یوزر برم ریدایرکت میکنه بلکه حتی بخوام به فرم لاگین ادمین هم برم بازم ریدایرکت میکنه در صورتی که باید فرم لاگین ادمین رو نشون بده چون این دوتا کاربر به هم ربطی ندارن..
برای ادمین هم همینطوره.. یعنی وقتی با تایپ ادمین لاگین میکنم بعدش توی سایت وقتی میخوام وارد فرم لاگین یوزر عادی بشم منو ریدایرکت میکنه و تنها وقتی میتونم واردش بشم که از ادمین خارج بشم..
همین مشکل رو چجوری حلش کنم که تفکیک رو قائل بشه؟
سلام
با توجه به تایپ یوزر شما نمیتونید همزمان بین دو حالت سویچ کنید، بقیه پرسشتون خیلی شفاف نیست، حالا روت ادمین و کاربر معمولی در یک صفحه هستند یا در دو صفحه؟ در سرویس پرووایدر چطور اون ها رو مشخص کردید؟
همچنین اگر در یک صفحه روت ها رو نوشتید می تونید براشون name اختصاصی بنویسید یا ترتیب مسیرها رو هم جابجا کنید.
@javadbolouri72
سلام و وقت بخیر
من خیلی لاراول کار نمیکنم ، ولی یه سوال
از کجا میفهمید که کاربر لاگین کرده ؟ سشن یا کوکی ست میکنید دیگه ؟
اگر آره ، ممکنه که مشکل از تشابه اسمی این دو سشن باشه ؟؟
به خاطر میدلور Guest هست که لاراول روی این Route ها اعمال میکنه.
منطقی هم هست.
کاربری که به هر شکلی لاگین میشه نباید بتونه دیگه فرم لاگین رو ببینه.
()Auth::routes رو بررسی کن و میدلور Guest رو از روی Route های login بردار .. باید مشکل حل بشه
این کدایی هست که داخل میدل ور RedirectifAuthenticated قرار دادم..
public function handle($request, Closure $next, $guard = null)
{
if(Auth::guard('admin')->check()){
return redirect() ->route('admin.dashboard');
}
else if(Auth::guard('web')->check()){
return redirect('/');
}
return $next($request);
}
ببینید همه چی درست کار میکنه، هر نوع یوزر سر جای خودش لاگین میتونه بشه و اگر با یوزر عادی لاگین کنم دسترسی به بخش ادمین ندارم و همه اینا درست کار میکنه...
فقط مشکل اینه..
اگر با یوزر عادی لاگین کنم(و با یوزر ادمین روی گارد ادمین لاگین نباشم)، حالا وقتی بخوام برم به صفحه لاگین ادمین، منو ریدایرکت میکنه به صفحه اصلی سایت...
اگر با یوزر ادمین لاگین کنم(و با یوزر عادی روی گار عادی لاگین نباشم)، حالا وقتی بخوام برم به صفحه لاگین عادی، منو ریدایرکت میکنه به دشبورد ادمین..
در صورتی که وقتی مثلا با یوزر عادی وارد شدم فقط لاگین عادی رو ریدایرکت باید بکنه نه لاگین ادمین رو..
خود لاراول سیستم احراز هویت داره که وقتی ازش تو پروژه استفاده کنیم تشخیص لاگین بودن و این چیزا رو خودش میده و کد نویسی اضافی نمیخواد.
و توی برای احراز هویت چند گانه برای هر نوع یوزر و جدول میشه گارد جدا تعریف کرد که تفکیک قائل بشه.. و تو شرط ها هم قید کنیم گارد رو تا بفهمه.
میخوام همزمان توی یه مرورگر هم بتونم با گارد یوزر وارد پنلش بشم و هم با گارد ادمین وارد پنل خودش..
با گارد ادمین که لاگین کردم فقط باید صفحه لاگین ادمین رو ریدایرکت کنه نه لاگین یوزر رو..
وقتی با ادمین لاگین هستم قاعدتا باید بتونم به صفحه لاگین یوزر عادی دسترسی داشته باشم. مشکلم اینجاست که نمیشه اونم ریدایرکت میکنه..
همین قضیه برای گارد یوزر عادی هم هست..
اینو چطوری میتونم حلش کنم؟
سلام - جواب آقای بیات درست بود - توی آدرس زیر
App\Http\Controllers\Auth
توی کنترلر LoginController توی تابع سازندش ( که قبل از اجرای هر دستوری یا تابعی، اول این تابع اجرا میشه)
public function __construct()
{
$this->middleware('guest')->except('logout');
}
(درسته که کلا پیاده سازی دیتابیس کاملا به خودتون ربط داره و هر جور که دوست داشته باشین میتونین پیاده سازی کنین اما)
یک نکته رو بگم که این نوع پیاده سازی کاملا اشتباست، و شما کافیه با گذاشتن یک فیلد به نام level توی جدول user نوع اون کاربر(ادمین - کاربر معمولی، و ....) رو پیاده سازی کنین و با استفاده از تعریف permission سطح دسترسی برای اون ها تعیین کنید.
البته من خودم توی یک پروژم(که انواع کاربر دارم) در کلاس logincontroller بعد از لاگین کردن کاربر(حالا هر نوعی که هست) ، اون رو به پنل مورد نظرش ریدایرکت میکنم و با توجه به اینکه روت های مربوط به هر نوع کاربر رو توی یک routegroup گذاشتم و برای اون روت گروپ یک middleware گذاشتم که فیلدlevel رو برررسی میکنه و بدین صورت ساده یک نوع سطح دسترسی برای انواع کاربرهام پیاده سازی کردم.
و توجه داشته باش که شما اگه خواستی یک روزی پروژه ات رو اپدیت کنی، مثلا کلا بخای زبان بک اندت رو عوض کنی، یا مثلا ورژن بالای لاراول اومد و خواستی پروژه ات رو به ورژن بالاتر لاراول ارتقا بدی، همه ی اینها امکان پذیره اما به شرطی که دیگه نیازی نباشه دیتابیست رو تغییر بدی( خلاصه کلام تجربه شخصیم توی چند تا پروژه که نوشتم اینه که پیاده سازی دیتابیس خیلی مبحث مهمیه)
ممنون بابت توضیحاتتون
الان این کدایی که گفتید توی تابع سازندش میدل ور guest رو اعمال میکنه، من متوجه نشدم باید چیکار کنم.. میگید برش دارم؟
همینو نمیشه بهش بگیم که guest روی گارد admin اگر بود یا مثلا اگر روی گارد web بود بیاد با شرط تفکیک کنه؟
یخورده گیج شدم از این قضیه که گفتید و آقای بیات هم گفتن
منظورم اینه نمیشه مشخص کرد که این guest برای گارد ادمین guest هست یا یوزر؟ که بعدش با شرط یه کارای بشه کرد
@javadbolouri72
سلام دوست عزیز واقعا نحوه پرسش سوالتون مبهمه
یک لطفی بکنین خط کد های مربوط به (روت ها و توابع مربوط) login برای دو نوع کابرتون رو اینجا بگذارین
آیا مایل به ارسال نوتیفیکیشن و اخبار از طرف راکت هستید ؟