راکت
میلاد هدایت پور
میلاد هدایت پور
6 سال پیش توسط میلاد هدایت پور مطرح شد
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
coarad supp
تخصص :برنامه نویس لاراول
@coaradsupp6 سال پیشمطرح شد
0

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

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

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


میلاد هدایت پور
میلاد هدایت پور
تخصص :در حال پیشرفت
@miladparsi10706 سال پیشمطرح شد
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
saman
@saman11116 سال پیشمطرح شد
0

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


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

@saman1111

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

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

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

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

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


میلاد هدایت پور
میلاد هدایت پور
تخصص :در حال پیشرفت
@miladparsi10706 سال پیشمطرح شد
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,
         ],

    ],

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


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

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


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

class Servant extends Authenticatable {

}

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

@MehdiAghighi

این کار رو هم کردم توی مدل

و اینم کلاس servant Auth


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

@miladparsi1070

use Illuminate\Foundation\Auth\User as Authenticatable;

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


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

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

use Illuminate\Foundation\Auth\User as Authenticatable;

میلاد هدایت پور
میلاد هدایت پور
تخصص :در حال پیشرفت
@miladparsi10706 سال پیشمطرح شد
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' => 'کاربری با این مشخصات یافت نشد',
                ]);
        }

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

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

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

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

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

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


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

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


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

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


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

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


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

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

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


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

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