@InsaneUser

Как убрать ошибку Unauthenticated в Laravel 5.3?

Доброго всем времени суток!
Прошу не пинать сильно за костыли, Laravel начал изучать совсем недавно)
Задача: сделать аутентификацию для нескольких типов пользователей.
Что было сделано:
  1. Созданы таблицы для каждого типа пользователей
  2. Созданы модели для каждой сущности
  3. Созданы контроллеры логина и регистрации для каждой сущности
  4. Созданы главные контроллеры для каждой сущности
  5. Созданы middleware и прописаны в Kernel.php
  6. Прописаны Guards в auth.php
  7. Прописаны роуты

Код ниже представлен для одного типа пользователя, для остальных все идентичное.
Model:
<?php

namespace App;

use Illuminate\Notifications\Notifiable;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Support\Facades\Validator;

class Patient extends Authenticatable
{
    use Notifiable;

    /**
     * The attributes that are mass assignable.
     *
     * @var array
     */
    protected $fillable = [
        'name', 'surname', 'birth_date','email', 'password', 'role'
    ];

    /**
     * The attributes that should be hidden for arrays.
     *
     * @var array
     */
    protected $hidden = [
        'password', 'remember_token',
    ];

    /**
     * Get a validator for an incoming registration request.
     *
     * @param  array  $data
     * @return \Illuminate\Contracts\Validation\Validator
     */
    protected static function validator(array $data)
    {
        return Validator::make($data, [
            'name' => 'required|max:255',
            'email' => 'required|email|max:255|unique:users',
            'password' => 'required|min:25|confirmed',
        ]);
    }
}


LoginController:
<?php

namespace App\Http\Controllers\AuthPatient;

use App\Http\Controllers\Controller;
use Illuminate\Foundation\Auth\AuthenticatesUsers;
use Auth;

class LoginController extends Controller
{
    use AuthenticatesUsers;

    protected $redirectTo = '/home';
    protected $redirectAfterLogout = '/home';

    public function __construct()
    {
        $this->middleware('guest', ['except' => 'logout']);
    }

    public function showLoginForm()
    {
        return view('patient.auth.login');
    }

    protected function guard()
    {
        return Auth::guard('patient');
    }
}

RegisterController
<?php

namespace App\Http\Controllers\AuthPatient;

use App\Patient;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\Validator;
use Illuminate\Foundation\Auth\RegistersUsers;
//use \App\Http\Controllers\Auth\RegisterController as MainRegisterController;

class RegisterController extends Controller
{
    use RegistersUsers;

    /**
     * Where to redirect users after registration.
     *
     * @var string
     */
    protected $redirectTo = '/';

    /**
     * Create a new controller instance.
     *
     * @return void
     */
    public function __construct()
    {
        $this->middleware('guest');
    }

    /**
     * Get a validator for an incoming registration request.
     *
     * @param array
     * @return \Illuminate\Contracts\Validation\Validator
     */
    protected function validator(array $data)
    {
        return Validator::make($data, [
            'name' => 'required|max:255',
            'email' => 'required|email|max:255|unique:users',
            'password' => 'required|min:6',
        ]);
    }

    /**
     * Create a new user instance after a valid registration.
     *
     * @param  array
     * @return Patient
     */
    protected function create(array $data)
    {
        return Patient::create([
            'name' => $data['name'],
            'email' => $data['email'],
            'password' => bcrypt($data['password']),
        ]);
    }
}

Routes:
Route::get('/patient','PatientsController@index');
    Route::get('/patient/login',['as' => 'patient.login','uses' => 'AuthPatient\LoginController@showLoginForm']);
    Route::post('/patient/login',['uses' => 'AuthPatient\LoginController@login']);
    Route::get('/patient/logout',['as' => 'patient.logout','uses' => 'AuthPatient\LoginController@logout']);

При попытке регистрации и/или входа: создается новая запись в соответствующей таблице, но входа не происходит. Выбрасывается исключение Unauthenticated скриптом Illuminate\Auth\Middleware\Authenticate.php. Auth::user() - NULL и массив $guards пустой.
Код, выбрасывающий это исключение:
/**
     * Determine if the user is logged in to any of the given guards.
     *
     * @param  array  $guards
     * @return void
     *
     * @throws \Illuminate\Auth\AuthenticationException
     */
    protected function authenticate(array $guards)
    {
        if (empty($guards)) {
            return $this->auth->authenticate();
        }

        foreach ($guards as $guard) {
            if ($this->auth->guard($guard)->check()) {
                return $this->auth->shouldUse($guard);
            }
        }

        throw new AuthenticationException('Unauthenticated.', $guards);
    }

При подключении нативного, по-совместительству дефолтного, гарда 'web' все работает корректно - в таблице users создается запись и происходит логин.
Подскажите, люди добрые, что и где мне поправить?
Заранее благодарен.
  • Вопрос задан
  • 969 просмотров
Пригласить эксперта
Ответы на вопрос 2
@Result007
P|-|P
Привет! Может попробовать изменить модель на Patient вместо User в config/auth.php?

fb45aec17d4648af9dc098d3009c2f4c.png
Ответ написан
Комментировать
@InsaneUser Автор вопроса
Спасибо за ответ! Возможно, это и решило бы задачу, если бы была одна недефолтная сущность, а у меня их четыре...
'providers' => [
        'users' => [
            'driver' => 'eloquent',
            'model' => App\User::class,
        ],

        'admin' => [
            'driver' => 'eloquent',
            'model' => App\Admin::class,
        ],

        'clinic' => [
            'driver' => 'eloquent',
            'model' => App\Clinic::class,
        ],

        'doc' => [
            'driver' => 'eloquent',
            'model' => App\Doc::class,
        ],

        'patient' => [
            'driver' => 'eloquent',
            'model' => App\Patient::class,
        ],
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы