如果在Laravel的内置身份验证中经过身份验证的逻辑重定向?

Mik*_*ike 10 php authentication laravel laravel-5.1

之前已经问过这个问题,我相信我的代码是正确的,但我的行为很奇怪.

我需要在登录后将用户重定向到不同的路由,具体取决于某些数据库值.我认为为了做到这一点,我只需将我的逻辑放在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);
}
Run Code Online (Sandbox Code Playgroud)

这不起作用,登录后用户被重定向到/home.我试图把dd($this->auth->user())里面$this->auth->check()的条件,但它永远不会被运行.如果我将它放在该检查之外,那么它就会在每次请求时运行.它看起来$this->auth->check()永远不会运行.

我的问题:如果不在这里,这个逻辑应该去哪里?

我也protected $redirectTo = '/account';从AuthController.php控制器中删除了.

man*_*hts 6

高级别答案:的目的RedirectIfAuthenticated是防止已经通过身份验证的用户访问已登录的登录或注册路由/视图。

测试:将登录视图添加为书签。然后登录。关闭浏览器或窗口。打开登录书签。您将直接进入用户的家或在中指定的位置RedirectIfAuthenticated。

出于LoginController的目的,创建一个redirecTo()方法,该redirectPath()方法用于查找您是否已自定义重定向。

// example
public function redirectTo()
{
    switch (auth()->user()->role) {
        case 'foo':
            return route('foo.home');

        case 'bar':
            return route('bar.home');

        default:
            auth()->logout();
            return route('web.welcome');
    }
}
Run Code Online (Sandbox Code Playgroud)


Mar*_*let 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.

}
Run Code Online (Sandbox Code Playgroud)

注意:我已经用$this->auth()Facade替代方法(Auth::)替换了该方法。只是因为我不确定AuthController是否具有auth()方法。