Перенаправить, если аутентифицированная логика во встроенной auth Laravel?

этот вопрос задавался раньше, и я считаю, что мой код верен, но я получаю странное поведение.

мне нужно перенаправить пользователя на различных маршрутах после входа в систему в зависимости от некоторых значений базы данных. Я думал, что для этого мне просто нужно поместить свою логику в handle метод app/Http/Middleware/RedirectIfAuthenticated.php. Мой метод в настоящее время выглядит так:

public function handle($request, Closure $next)
{

    if ($this->auth->check()) {
        if($this->auth->user()->sign_up_complete == 1){
            return redirect('/');
        } else {
            if($this->auth->user()->step_one_complete == 0){
                return redirect('/register/step-1');
            } elseif($this->auth->user()->step_two_complete == 0){
                return redirect('/register/step-2');
            } else {
                return redirect('/');
            }
        }
    }

    return $next($request);
}

это не работает, и при входе в систему пользователь перенаправляется на /home. Я пробовал разместить dd($this->auth->user()) внутри $this->auth->check() состояние, но он никогда не запускается. Если я помещаю его вне этой проверки, то он запускается по каждому запросу. Похоже на $this->auth->check() никогда не выполняется.

мой вопрос: если не здесь, то куда должна идти эта логика?

Я удалил protected $redirectTo = '/account'; С тоже.

5 ответов


вы неправильно используете промежуточное ПО. Этот фрагмент кода будет срабатывать каждый раз, когда вы отправляете запрос при входе в систему.

изменить расположение перенаправления после входа в систему вы можете переопределить redirectPath() метод в AuthController. (Вы можете найти исходный метод в vendor/laravel/framework/src/Illuminate/Foundation/Auth/RedirectsUsers.php)

это будет выглядеть так:

...

public class AuthController extends Controller {

    ...

    public function redirectPath()
    {
        if(Auth::user()->sign_up_complete == 1) {
            return '/';
        } else {
            if(Auth::user()->step_one_complete == 0) {
                return '/register/step-1';
            } elseif(Auth::user()->step_two_complete == 0) {
                return '/register/step-2';
            } else {
                return '/';
            }
        }
    }


    // The rest of the class implementation.

}

примечание: Я заменил $this->auth() метод с альтернативой фасада (Auth::). Просто потому что я не конечно, если AuthController имеет auth() метод.


Я думаю, что это так просто, как настройка пользовательского промежуточного класса для проверки ваших запросов на основе значений базы данных, я делаю это для исключения пользователей без правильной роли.

роль определена в моей таблице пользователей, и доступ к системе разрешен только пользователям с ролью администратора.

namespace App\Http\Middleware;

use Closure;
use Illuminate\Support\MessageBag;

class RolesMiddleware
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        // If a user is authenticated
        if(\Auth::user() != null)
        {
            // If the user doesn't have the correct role
            if(\Auth::user()->role != 'administrator')
            {
                // logout the user
                \Auth::logout();

                // create a new MessageBag
                $messageBag = new MessageBag;

                // add a message
                $messageBag->add('not_allowed', 'You are not allowed to login, because you do not have the right role!');

                // redirect back to the previous page with errors
                return \Redirect::to('login')->withErrors($messageBag);
            }
        }

        return $next($request);

    }
}

решение в ответ Марк Валет, но нуждаются в небольшой коррекции. Возврат должен быть строкой:

public class AuthController extends Controller {

    ...

    public function redirectPath()
    {
        if(Auth::user()->sign_up_complete == 1) {
            return '/';
        } else {
            if(Auth::user()->step_one_complete == 0) {
                return '/register/step-1';
            } elseif(Auth::user()->step_two_complete == 0) {
                return '/register/step-2';
            } else {
                return '/';
            }
        }
    }


    // The rest of the class implementation.

}

u не может изменить основные файлы laravel все, что вам нужно сделать, это добавить этот код в Auth\AuthController

protected $redirectPath = '/dashboard';

чтобы понять, почему ваша логика маршрутизации никогда не достигается, вы должны посмотреть в app/Http/Kernel.php где зарегистрировано промежуточное ПО RedirectIfAuthenticated:

protected $routeMiddleware = [
    ...
    'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
    ...
];

это означает, если пользователь переходит к маршруту, который не защищен guest промежуточное ПО маршрута, запрос никогда не проходит через класс RedirectIfAuthenticated и поэтому полностью пропускает вашу логику.

вы можете добавить гостевое промежуточное ПО к вашим маршрутам регистрации в файле маршрутов, чтобы заставить маршрутизацию чтобы пройти через ваш код следующим образом:

Route::get('/register/step-1', '<YOUR CONTROLLER METHOD>')->middleware('guest');

но, поскольку вы говорите, что пользователь уже вошел в систему (не гость), вы должны вместо этого переместить свой код, как предложено другими ответами.

только добавив это в качестве ответа, потому что это не может быть разъяснено в пространстве, разрешенном комментарием.