我正在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', '.*');
这可以实现我所追求的行为,但感觉不正确-有更好的方法吗?
答案 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
对我不起作用。