Laravel 5中的委托路线保护 - 首先检查Auth

时间:2015-04-21 10:27:30

标签: php laravel laravel-5

出于某种原因,我有一个心灵障碍,无法弄清楚可能是一个非常简单的修复。

我有一个Laravel 5应用程序,并使用Zizaco的Entrust包进行访问控制。

我想保护一条路线,所以在routes.php中使用路由保护,如下所示:

Entrust::routeNeedsRole('passtypes', array('admin'), null, false);

除了用户的会话已过期或未登录并尝试访问路径之外,其中包含预期的效果。

在这种情况下,我希望首先检查Laravel的身份验证,然后重定向到登录页面;但是Entrust首先重定向到403错误;这对于能够查看该页面的用户来说很困惑,但被告知他们没有访问权限,而不是他们没有登录/会话已经过期。

我在Controller中启动身份验证而不是路由:

public function __construct()
{
    $this->middleware('auth');
}

因此,只需知道如何获得相同的功能,但需要在路由权限要求之前检查身份验证。

由于

2 个答案:

答案 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保护您的路线。