میلاد هدایت پور
4 سال پیش توسط میلاد هدایت پور مطرح شد
17 پاسخ

لاگین کردن یوزر از جدولی به غیر از جدول یوزرها

سلام من لاگین اصلی برنامم توی جدول یوزرهاست و مشکلی نداره
حالا تو یه بخشی میخام اپراتورهارو هم از جدول 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 لاراول رو بفهمونم که ازینجا لاگینش کنه؟ تو نت نوشته بود باید گارد رو عوض کنم ولی نمیدونم چجوریه و اینکه بعد اون لاگین اصلیم بهم نخوره
کسی میتونه کمک کنه؟


ثبت پرسش جدید
coarad supp
تخصص : برنامه نویس لاراول
@coaradsupp 4 سال پیش مطرح شد
0

سلام، برای این کار باید با multi auth کار کنید

https://pusher.com/tutorials/multiple-authentication-guards-laravel

باید گارد تعریف کنید و تنظیماتی شبیه یوزر انجام بدین


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

@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' => 'کاربری با این مشخصات یافت نشد',
                ]);
        }

saman
@saman1111 4 سال پیش مطرح شد
0

@miladparsi1070
خب شما باید guardی که میخواین باهاش لاگین انجام بشه رو تعیین کنین
روش های مختلفی برای تعیینش هست. مثلا توی middleware یا کنترلر یا...


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

@saman1111

اینطوری هم تست کردم بازم همش اطلاعات اپراتور رو برمیگردونه

if  (Auth::guard('servant')->attempt(['phone' => $request->input('mobile'), 'password' => $request->input('password')], $remember_me))
{

    return Redirect::to('/profile');
}

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

@miladparsi1070
گارد رو که تعریف کردید Provider ش رو گزاشتید روی App\Servant ؟
چون در غیر از این صورت سعی می‌کنه از پوشه‌ی user ها لاگین کنه.
در کل باید model ی که مربوط به هر گارد می‌شه رو مشخص کنید. حالا ممکنه دو تا گارد از App\User استفاده کنن یکی از App\Admin یا هر چیز دیگه.


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

@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,
         ],

    ],

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


مهدی عقیقی
تخصص : برنامه نویس وب
@MehdiAghighi 4 سال پیش آپدیت شد
0

@miladparsi1070 خب شما باید کلاس App\Servant رو از Authenticatable اکستند کنی که نکردی این کارو
کدش رو می‌تونی از کلاس App\User برداری.


use Illuminate\Auth\Authenticatable;
یا 
use Illuminate\Foundation\Auth\User as Authenticatable;

class Servant extends Authenticatable {

}

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

@MehdiAghighi

این کار رو هم کردم توی مدل
توضیح تصویر رو وارد کنید

و اینم کلاس servant Auth
توضیح تصویر رو وارد کنید


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

@miladparsi1070

use Illuminate\Foundation\Auth\User as Authenticatable;

این رو استفاده کنید درست میشه.
شما خودتون که نباید تو اون پوشه‌های لاراول چیزی بسازید.
همون User رو استفاده کنید درسته


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

@miladparsi1070 این $table و ... هم باید توی همون مدل Servant اصلی بزارید.
و از کلاس زیر استفاده کنید

use Illuminate\Foundation\Auth\User as Authenticatable;

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

@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' => 'کاربری با این مشخصات یافت نشد',
                ]);
        }

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

اینارو هم توی مدل servant گداشتم

  protected $guard = 'servant';
    protected $table = 'servants';

مهدی عقیقی
تخصص : برنامه نویس وب
@MehdiAghighi 4 سال پیش آپدیت شد
0

ببینید اروری که داره بهتون میده خیلی واضح داره می‌گه که کلاس App\Servant یک instance از Authenticatable نیست.

اگر ارور همون قبلیه‌س یعنی یه جای کار اشتباه کردید یه دور دیگه چک کنید و اگر ارور عوض شده توی یه مبحث دیگه بازش کنید یا همینجا ارور جدید رو بگید


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

@MehdiAghighi
ارور نیست اون اخه فقط میگه اگه میخای rename کنیمش برات
هیچ اروری نمیده
جاهای مختلف مشخصات یوزر رو ریترن میکنم که الان فقط برای کاربر عادی رو ریترن میکنه


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

@miladparsi1070 اون عکسی که بالا گزاشتید. میگم هنوز اون ارور رو میده یا خیر ؟ همون عکسی که توی اولین پیام گفتگوعه


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

@MehdiAghighi
نه اون ارور که نمیاد دیگه
الان کلا ارور نمیاد ولی کاربرارو جای هم لاگین میکنه
گیج شدم خودمم راستش😅


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

@miladparsi1070 خب پس اون ارور مشکل حل شده با اضافه کردن همون Authenticatable.

حالا به نظرم یه مبحث جدید باز کنید تا اون یکی رو راحت‌تر بشه مشکلشو پیدا کرد


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

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