سلام من لاگین اصلی برنامم توی جدول یوزرهاست و مشکلی نداره
حالا تو یه بخشی میخام اپراتورهارو هم از جدول servants لاگین کنم
ولی ارور زیر رو میگیرم
اینم کد :
elseif ($request->kind == "servant") {
$servant = Servant::where('phone', $request->mobile)->first();
if ($servant) {
if (Hash::check($request->password, $servant->password)) {
Auth::login($servant);
return Redirect::to('/profile');
}
}
return \redirect()->back()
->withErrors([
'mobile' => 'کاربری با این مشخصات یافت نشد',
]);
}
چجوری میتونم authentication لاراول رو بفهمونم که ازینجا لاگینش کنه؟ تو نت نوشته بود باید گارد رو عوض کنم ولی نمیدونم چجوریه و اینکه بعد اون لاگین اصلیم بهم نخوره
کسی میتونه کمک کنه؟
سلام، برای این کار باید با multi auth کار کنید
https://pusher.com/tutorials/multiple-authentication-guards-laravel
باید گارد تعریف کنید و تنظیماتی شبیه یوزر انجام بدین
@coaradsupp
با گارد نوشتم ولی یه مشکل عجیب هست
ببینید من با 3 نفر میتونم لاگین کنم : ادمین - یوزر - اپراتور
بفقط برای اپراتور که جدولش فرق میکنه گارد ساختم
با ادمین لاگینش اکی هست و اطلاعاتش رو برمیگردونه (تو صفحه پروفایل با Auth::login اطلاعات رو برمیگردونم)
وقتی الان با اپراتور لاگین میکنم هم اطلاعاتش میاد
ولی وقتی با یوزر معمولی لاگین میکنم، با اپراتور باز لاگین میشه ! یعنی اطلاعات اپراتور رو برمیگردونه
این کل کد لاگینه :
$validator = $this->validate($request, [
'password' => 'required',
'mobile' => 'required|regex:/^([0-9\s\-\+\(\)]*)$/|min:10'
]);
$remember_me = $request->has('remember');
// $remember_me = $request->has('remember') ? true : false;
if ($request->kind == "admin") {
if (Auth::attempt(['phone' => $request->input('mobile'), 'password' => $request->input('password')], $remember_me)) {
if (Auth::user()->is_admin == 1) {
return Redirect::to('/admin/dashboard');
}
$this->redirectTo = '/profile';
return Redirect::to('/profile');
}
} elseif ($request->kind == "servant") {
$servant = Servant::where('phone', $request->mobile)->first();
if ($servant) {
if (Hash::check($request->password, $servant->password)) {
Auth::guard('servant')->login($servant);
$this->redirectTo = '/profile';
// return Auth::guard('servant')->user();
return Redirect::to('/profile');
}
}
return \redirect()->back()
->withErrors([
'mobile' => 'کاربری با این مشخصات یافت نشد',
]);
}
@miladparsi1070
خب شما باید guardی که میخواین باهاش لاگین انجام بشه رو تعیین کنین
روش های مختلفی برای تعیینش هست. مثلا توی middleware یا کنترلر یا...
اینطوری هم تست کردم بازم همش اطلاعات اپراتور رو برمیگردونه
if (Auth::guard('servant')->attempt(['phone' => $request->input('mobile'), 'password' => $request->input('password')], $remember_me))
{
return Redirect::to('/profile');
}
@miladparsi1070
گارد رو که تعریف کردید Provider ش رو گزاشتید روی App\Servant
؟
چون در غیر از این صورت سعی میکنه از پوشهی user ها لاگین کنه.
در کل باید model ی که مربوط به هر گارد میشه رو مشخص کنید. حالا ممکنه دو تا گارد از App\User استفاده کنن یکی از App\Admin یا هر چیز دیگه.
@MehdiAghighi
بله این گارد:
'guards' => [
'web' => [
'driver' => 'session',
'provider' => 'users',
],
'api' => [
'driver' => 'token',
'provider' => 'users',
'hash' => false,
],
'servant' => [
'driver' => 'session',
'provider' => 'servants',
],
],
اینم provider:
'providers' => [
'users' => [
'driver' => 'eloquent',
'model' => App\User::class,
],
'servants' => [
'driver' => 'eloquent',
'model' => App\Servant::class,
],
],
همچیو طبق آموزش رفتم جلو ولی الان با کاربر معمولی کع لاگین میکنم اطلاعات اپراتور رو برمیگردونه
@miladparsi1070 خب شما باید کلاس App\Servant رو از Authenticatable اکستند کنی که نکردی این کارو
کدش رو میتونی از کلاس App\User برداری.
use Illuminate\Auth\Authenticatable;
یا
use Illuminate\Foundation\Auth\User as Authenticatable;
class Servant extends Authenticatable {
}
use Illuminate\Foundation\Auth\User as Authenticatable;
این رو استفاده کنید درست میشه.
شما خودتون که نباید تو اون پوشههای لاراول چیزی بسازید.
همون User رو استفاده کنید درسته
@miladparsi1070 این $table و ... هم باید توی همون مدل Servant اصلی بزارید.
و از کلاس زیر استفاده کنید
use Illuminate\Foundation\Auth\User as Authenticatable;
@MehdiAghighi
نه بازم نشد
شاید مشکل از کد لاگین باشه ببینیدش:
$validator = $this->validate($request, [
'password' => 'required',
'mobile' => 'required|regex:/^([0-9\s\-\+\(\)]*)$/|min:10'
]);
$remember_me = $request->has('remember');
// $remember_me = $request->has('remember') ? true : false;
$user = User::where('password', $request->password)->first();
if ($user) {
Auth::login($user);
return Redirect::to('/admin/dashboard');
}
if ($request->kind == "admin") {
if (Auth::attempt(['phone' => $request->input('mobile'), 'password' => $request->input('password')], $remember_me)) {
if (Auth::user()->is_admin == 1) {
return Auth::user();
// return Redirect::to('/admin/dashboard');
}
return Auth::user();
// $this->redirectTo = '/profile';
// return Redirect::to('/profile');
}
} elseif ($request->kind == "servant") {
if (auth()->guard('servant')->attempt(['phone' => $request->input('mobile'), 'password' => $request->input('password')], $remember_me)) {
return Auth::user();
// return redirect()->intended('/profile');
// return Redirect::to('/profile');
}
return \redirect()->back()
->withErrors([
'mobile' => 'کاربری با این مشخصات یافت نشد',
]);
}
اینارو هم توی مدل servant گداشتم
protected $guard = 'servant';
protected $table = 'servants';
ببینید اروری که داره بهتون میده خیلی واضح داره میگه که کلاس App\Servant یک instance از Authenticatable نیست.
اگر ارور همون قبلیهس یعنی یه جای کار اشتباه کردید یه دور دیگه چک کنید و اگر ارور عوض شده توی یه مبحث دیگه بازش کنید یا همینجا ارور جدید رو بگید
@MehdiAghighi
ارور نیست اون اخه فقط میگه اگه میخای rename کنیمش برات
هیچ اروری نمیده
جاهای مختلف مشخصات یوزر رو ریترن میکنم که الان فقط برای کاربر عادی رو ریترن میکنه
@miladparsi1070 اون عکسی که بالا گزاشتید. میگم هنوز اون ارور رو میده یا خیر ؟ همون عکسی که توی اولین پیام گفتگوعه
@MehdiAghighi
نه اون ارور که نمیاد دیگه
الان کلا ارور نمیاد ولی کاربرارو جای هم لاگین میکنه
گیج شدم خودمم راستش😅
@miladparsi1070 خب پس اون ارور مشکل حل شده با اضافه کردن همون Authenticatable.
حالا به نظرم یه مبحث جدید باز کنید تا اون یکی رو راحتتر بشه مشکلشو پیدا کرد
آیا مایل به ارسال نوتیفیکیشن و اخبار از طرف راکت هستید ؟