Laravel Redirect如果经过身份验证的中间件

时间:2017-09-13 11:46:55

标签: php laravel redirect laravel-5 laravel-request

我有三种类型的应用程序用户,每个用户都有自己的dashboard。我需要检查管理员是否有任何其他用户无法看到其他用户信息中心。

有一个中间件RedirectIfAuthenticated

public function handle($request, Closure $next, $guard = null){

    if (Auth::guard($guard)->check() && auth()->user()->type == 'admin'){
        return redirect('/admin');
    }

    if (Auth::guard($guard)->check() && auth()->user()->type == 'author'){
        return redirect('/author');
    }

    if (Auth::guard($guard)->check() && auth()->user()->type == 'client'){
        return redirect('/client');
    }
}

它位于guest中间件之下。

以上代码对我来说似乎很好但是当我测试它时,浏览器会说Too many redirects

我做错了什么,处理它的最佳方法是什么。

5 个答案:

答案 0 :(得分:2)

您可能误解了该中间件的用途。 RedirectIfAuthenticated的目的是将用户重定向到其默认的经过身份验证的页面。它并不意味着阻止未经身份验证/未经授权的用户访问特定区域。

如果未经授权,您需要做的是重定向。由于这是一个简单的案例,你可以拥有一个中间件:

class RequireRole {
     public function handle($request, Closure $next, $role) {
          abort_unless(auth()->check() && auth()->user()->type == $role, 403, "You don't have permissions to access this area");
           return $next($request);
     }
}

然后在Kernel.php

中注册此中间件
protected $routeMiddleware = [
        //Other middleware
        "requirerole" => RequireRole::class
];

然后你可以在路线中使用它,例如

Route::get('/admin', function () { /* action */ })->middleware("requirerole:admin");

但是,如果您发现自己需要更复杂的规则,请查看Authorization

答案 1 :(得分:0)

需要稍微修改一下代码

public function handle($request, Closure $next, $guard = null){

        if (Auth::guard($guard)->check() && auth()->user()->type == 'admin'){
            return redirect('/admin');
        }

        if (Auth::guard($guard)->check() && auth()->user()->type == 'author'){
            return redirect('/author');
        }

        if (Auth::guard($guard)->check() && auth()->user()->type == 'client'){
            return redirect('/client');
        }
        return $next($request);
}

答案 2 :(得分:0)

您必须为每个if语句添加额外的检查,以查看您是否已经在它将重定向到

的路线上

可能是这样的:

&& $request->is('admin')

答案 3 :(得分:0)

只需拆开支票并保留原始退货:

     public function handle($request, Closure $next, $guard = null){
             if (Auth::guard($guard)->check()){

               if(Auth::user()->type == 'admin'){
                    return redirect('/admin');
               }
               if(Auth::user()->type == 'author'){
                    return redirect('/author');
               }
               if(Auth::user()->type == 'client'){
                    return redirect('/client');
               }
            }
            return $next($request);
    }

答案 4 :(得分:0)

正如接受的答案中指出的那样,中间件的目的是在用户通过身份验证时重定向用户。

现在,如果您选中App\Http\Kernel.php,将会看到中间件已附加到guest路由中间件变量中。

因此,您分配给来宾中间件的任何路由都不会由经过身份验证的用户访问。

要解决您的问题,请按照接受的答案创建另一个中间点。

如果未经授权,您需要做的是重定向。由于这是一个简单的案例,您可以 只是有一个中间件:

    public function handle($request, Closure $next, $role) {
        abort_unless(auth()->check() && auth()->user()->type == $role, 403, "You don't > have permissions to access this area");
          return $next($request);
    }
}

然后在您的Kernel.php中注册该中间件

      //Other middleware
       "requirerole" => RequireRole::class
];

然后您可以在路线中使用它,例如

Route::get('/admin', function () { /* action */ })->middleware("requirerole:admin");

实际上,除非不可避免,否则您可能不需要修改laravel随附的默认文件。