Laravel-如果未经授权,即使未注册路由,也重定向到登录

时间:2018-08-09 16:14:42

标签: laravel

我正在Laravel v5.6中构建一个应用程序,该应用程序应完全位于登录页面的后面(登录页面本身和密码重置页面除外)。

我已经编写了一个中间件类CheckAuth-要点是,

public function handle($request, Closure $next)
{
    if (auth()->guest() && $this->requestIsNotForGuests($request->path())) {
        return redirect()->route('login');
    }

    return $next($request);
}

如果未经身份验证的用户请求未经注册的路由,他们将看到404页面。未经身份验证的用户不应该知道路由是否存在。

如何将任何未经身份验证的请求(不包括登录页面本身和密码重置页面)重定向到登录页面?

我尝试将路由组和中间件一起使用在route / web.php中,但这不能按预期工作。


更新...

我在routes/web.php的末尾添加了以下内容,

Route::any('{any}', function() {
    abort(404);
})->where('any', '.*');

这可以实现我所追求的行为,但感觉不正确-有更好的方法吗?

3 个答案:

答案 0 :(得分:2)

您只需要将所有路由包装在中间件中。这是很常见的做法。您的中间件决定了规则并相应地重定向,如果通过了验证,则重定向到用户尝试访问的路由,否则,将重定向到其他位置/不同的操作。

Route::middleware('auth')->group(function() {
    //Routes you want affected here
});

标准的Auth中间件就可以解决此问题,只要将其修改为您想要通过身份验证的用户即可。

修改

出于常识,您的登录页面将不在中间件组中

**编辑2 **

更好地理解了问题之后,您尝试通过任何路由,即使auth中间件中不存在该路由。

使用我在上面输入的所有信息,现在需要应用此信息。

使用标准的身份验证中间件,您无需更改任何有关中间件的内容,它将满足您的要求

按照中间件组中的建议包装您的路由,看看我在上面输入的内容,省去登录路由!

现在在中间件组的外部下方,添加一个新的路由,例如下面的示例,该路由将在外部,并带有登录提示

Route::get(/{slug}, 'HomeController@redirector');

我必须强调,此路由必须是您的web.php中的最后一个

现在在HomeController中创建一个方法,如下所示:

public function redirector($slug)
{
    return redirect()->route('login');
}

答案 1 :(得分:0)

尝试一下:

if (Auth::guest()) {
   return redirect()->route('route_name');
}

没有return $next($request);(导致请求“继续”)。

顺便说一句,您可以创建新的路由文件并将其注册在RouteServiceProvider中。而且您没有指定Laravel版本...

答案 2 :(得分:0)

如果您只想显示登录页面而不是404,则可以修改\App\Exceptions\Handler::render方法。放置

if ($exception instanceof NotFoundHttpException) return redirect('/login');

此方法的第一行。还有

use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;

当然。

$exception->getCode() === 404对我不起作用。