出于某种原因,我有一个心灵障碍,无法弄清楚可能是一个非常简单的修复。
我有一个Laravel 5应用程序,并使用Zizaco的Entrust包进行访问控制。
我想保护一条路线,所以在routes.php中使用路由保护,如下所示:
Entrust::routeNeedsRole('passtypes', array('admin'), null, false);
除了用户的会话已过期或未登录并尝试访问路径之外,其中包含预期的效果。
在这种情况下,我希望首先检查Laravel的身份验证,然后重定向到登录页面;但是Entrust首先重定向到403错误;这对于能够查看该页面的用户来说很困惑,但被告知他们没有访问权限,而不是他们没有登录/会话已经过期。
我在Controller中启动身份验证而不是路由:
public function __construct()
{
$this->middleware('auth');
}
因此,只需知道如何获得相同的功能,但需要在路由权限要求之前检查身份验证。
由于
答案 0 :(得分:0)
我认为Entrust::routeNeedsRole
在控制器之前触发。你能把Entrust
移到中间件吗?然后,您可以检查中间件是否已登录,然后检查他是否具有所需角色。
答案 1 :(得分:0)
已经有一段时间了,但我遇到了类似的问题。唯一的区别是,我的整个应用程序必须受到保护。我最终修改了Authenticate Middleware句柄方法:
public function handle($request, Closure $next)
{
if ($this->auth->guest()) {
if ($request->ajax()) {
return response('Unauthorized.', 401);
} else {
/**
* This is to protect the entire app, except login form,
* to avoid loop
*/
if($request->path() != 'auth/login')
return redirect()->guest('auth/login');
}
}
return $next($request);
}
在Kernel.php内部将Authenticate从$ routeMiddleware移动到$ middleware
然后您可以使用Entrust保护您的路线。