Laravel перенаправляет на вход после аутентификации

ПРОБЛЕМА

Я занят своим первым приложением Laravel, и хотя я вижу преимущества того, как все написано, мне трудно понять некоторые особенности поведения.

Когда я пытаюсь войти, меня перенаправляет на страницу входа. Кажется, что пользователь правильно аутентифицируется, но все равно перенаправляет на страницу входа.

ЧТО Я ИМЕЮ

Моя таблица пользователей выглядит так:

,---------,---------------,---------------,----------------,---------------,-----------,
| user_id | user_username | user_password | user_firtsname | user_lastname | user_type |
|---------|---------------|---------------|----------------|---------------|-----------|
| 1       | [email protected] | encrypted     | Foo            | Bar           | farmer    |
'---------'---------------'---------------'----------------'---------------'-----------'

Это мой файл маршрутов:

<?php
Route::get('/login', 'UsersController@login');

Auth::routes();
Route::get('/dashboard', 'HomeController@dashboard')->name('dashboard');
Route::get('/users/grid', 'UsersController@grid');
Route::resource('/users', 'UsersController');

Логинконтроллер.php

<?php
namespace App\Http\Controllers\Auth;

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

class LoginController extends Controller
{
    /*
    |--------------------------------------------------------------------------
    | Login Controller
    |--------------------------------------------------------------------------
    |
    | This controller handles authenticating users for the application and
    | redirecting them to your home screen. The controller uses a trait
    | to conveniently provide its functionality to your applications.
    |
    */

    use AuthenticatesUsers;

    /**
     * @var string
     */
    protected $redirectTo = '/dashboard';

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

    /**
     * @return string
     */
    public function username()
    {
        return 'user_username';
    }

    /**
     * @param Request $request
     * @param $user
     * @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector
     */
    public function authenticated(Request $request, $user)
    {
        return $user->user_type === 'farmer' ? redirect('/dashboard') : redirect('/admin');
    }
}

Пользователь.php

<?php
namespace App;

use Illuminate\Notifications\Notifiable;
use Illuminate\Foundation\Auth\User as Authenticatable;

class User extends Authenticatable
{
    use Notifiable;

    /**
     * @var array
     */
    protected $fillable = [
        'user_username', 'user_firstname', 'user_lastname', 'user_password',
    ];

    /**
     * @var array
     */
    protected $hidden = [
        'user_password', 'remember_token',
    ];

    /**
     * @var bool
     */
    public $timestamps = false;

    /**
     * @return mixed|string
     */
    public function getAuthPassword()
    {
        return $this->user_password;
    }

    /**
     * @return string
     */
    public function getKey()
    {
        return $this->user_id;
    }
}

ЧТО Я СДЕЛАЛ

Я прочитал различные вопросы на stackoverflow, но по какой-то причине я не могу заставить работать логин.

Я создал авторизацию, используя php artisan make:auth. Я тоже пытался читать документацию, но все равно не повезло.

ВОПРОС

Как мне заставить его перенаправлять на панель инструментов после входа в систему? Что мне не хватает?


person Bird87 ZA    schedule 14.10.2018    source источник
comment
вы должны изменить поле user_password на password. Потому что некоторые методы в laravel используют жестко заданное поле password в качестве пароля. Вы сначала измените это, тогда оно будет работать.   -  person Lakhwinder Singh    schedule 14.10.2018
comment
Я бы предпочел не менять поле пароля в БД. Есть ли способ, которым я могу изменить его, прежде чем он пройдет через весь код laravel?   -  person Bird87 ZA    schedule 14.10.2018
comment
вы должны переопределить эти функции в LoginController, изменив поле password на поле user_password   -  person Lakhwinder Singh    schedule 14.10.2018
comment
Какие это функции? Если бы вы могли указать мне в правильном направлении. Кроме того, это не имеет смысла, потому что если я поставлю dd($user) в вызов authenticated в своем LoginController, он покажет аутентифицированного пользователя.   -  person Bird87 ZA    schedule 14.10.2018


Ответы (4)


Вам нужно добавить эту опору в вашу пользовательскую модель.

protected $primaryKey = 'user_id';

Удалите метод authenticated() из контроллера входа в систему.

И обрабатывать перенаправление на основе типа пользователя внутри RedirectIfAuthenticated промежуточного ПО

<?php

namespace App\Http\Middleware;

use Closure;
use Illuminate\Support\Facades\Auth;

class RedirectIfAuthenticated
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @param  string|null  $guard
     * @return mixed
     */
    public function handle($request, Closure $next, $guard = null)
    {
        if (Auth::guard($guard)->check()) {
          if (Auth::guard($guard)->user->user_type === 'farmer'){
            redirect('/dashboard'); // make sure the urls is correct with condition above 
          }
          return redirect('/admin');
        }

        return $next($request);
    }
}

Дополнительный шаг внутри класса App\Exceptions\Handler

Добавьте этот метод, если у вас разные страницы входа для каждого типа пользователей

/**
 * @param Request $request
 * @param AuthenticationException $exception
 * @return JsonResponse|RedirectResponse|\Symfony\Component\HttpFoundation\Response
 */
protected function unauthenticated($request, AuthenticationException $exception)
{
    if ($request->expectsJson()) {
        return response()->json(['error' => 'Unauthenticated.'], 401);
    }
    if ($request->is('dashboard') || $request->is('dashboard/*')) {
        return redirect()->guest('/dashboard/login');
    }

    return redirect()->guest('farmer/login');
}
person Ahmad Elkenany    schedule 23.10.2019

У меня была такая же проблема вчера вечером. Я обнаружил, что проблема заключается в том, что Auth::attempt() не сохраняет логин, поэтому, когда пользователь успешно вошел в систему, он был удален в сеансе после перенаправления на /home.

Ниже приведена ссылка на ответ для ее решения: /а>

Попробуйте добавить что-то вроде

protected $primaryKey = 'user_id'; in class User{}

(приложение/модели/User.php)

(Поле user_id является ключом автоматического увеличения в моей схеме для таблицы «пользователи»)

person Wang Peter    schedule 08.06.2019

Вы используете поле user_password вместо поля password. Итак, вам нужно внести некоторые изменения в файл LoginController.php. Ниже представлен обновленный файл LoginController. Попробуйте внести подобные изменения, а затем попробуйте войти в систему.

<?php
namespace App\Http\Controllers\Auth;

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

class LoginController extends Controller
{
    /*
    |--------------------------------------------------------------------------
    | Login Controller
    |--------------------------------------------------------------------------
    |
    | This controller handles authenticating users for the application and
    | redirecting them to your home screen. The controller uses a trait
    | to conveniently provide its functionality to your applications.
    |
    */

    use AuthenticatesUsers;

    /**
     * @var string
     */
    protected $redirectTo = '/dashboard';

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

    /**
     * @return string
     */
    public function username()
    {
        return 'user_username';
    }

    /**
     * @param Request $request
     * @param $user
     * @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector
     */
    public function authenticated(Request $request, $user)
    {
        return $user->user_type === 'farmer' ? redirect('/dashboard') : redirect('/admin');
    }

    /**
     * Validate the user login request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return void
     */
    protected function validateLogin(Request $request)
    {
        $this->validate($request, [
            $this->username() => 'required|string',
            'user_password' => 'required|string',
        ]);
    }

    /**
     * Get the needed authorization credentials from the request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return array
     */
    protected function credentials(Request $request)
    {
        return $request->only($this->username(), 'user_password');
    }
}

Я добавил две функции validateLogin и credentials, где поле по умолчанию было password. и я изменил это с помощью user_password.

person Lakhwinder Singh    schedule 14.10.2018
comment
Это не работает. Мой файл просмотра входа в систему имеет password в качестве поля ввода. У моего User.php есть аксессор для пароля, который аутентифицируется в моем поле БД, user_password. Как я уже сказал в своем комментарии, если я dd($user) в своей функции authenticated, она возвращает аутентифицированного пользователя, просто не перенаправляет. - person Bird87 ZA; 14.10.2018

для аутентификации в laravel сначала используйте команду php artisan make:auth

и в вашем web.php добавьте только Auth::routes();, у которых есть все маршруты аутентификации

и чтобы проверить, вошли ли вы в систему или нет, вы должны добавить $this->middleware('auth'); в конструктор контроллера, например

 public function __construct()
    {
        $this->middleware('auth');
    }

и не забудьте вызвать класс авторизации, например use Auth;

или вы можете проверить аутентификацию в своих маршрутах, добавив аутентификацию промежуточного программного обеспечения

а также проверьте документацию https://laravel.com/docs/5.7/authentication.

person Sally Akl    schedule 14.10.2018