【问题标题】:Entrust Route Protection in Laravel 5 - Check for Auth firstLaravel 5 中的 Entrust 路由保护 - 首先检查 Auth
【发布时间】:2015-04-21 10:27:30
【问题描述】:

出于某种原因,我有一个思维障碍,无法弄清楚可能是一个非常简单的解决方法。

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

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

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

除了用户的会话已过期或他们未登录并尝试访问路由之外,这按预期工作。

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

我在控制器中而不是在路由中启动身份验证:

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

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

谢谢

【问题讨论】:

    标签: php laravel laravel-5


    【解决方案1】:

    我认为Entrust::routeNeedsRole 在控制器之前触发。您可以将Entrust 移动到中间件吗?然后,如果用户已登录,您可以检查中间件,然后检查他是否具有所需的角色。

    【讨论】:

    • 感谢您的回复 - 因为 Entrust 是一个单独的包,并且在我的整个应用程序中都可以使用,所以我很小心弄乱它的功能。
    • 我检查了 Entrust 文档,它提供了直接检查用户角色的方法,因此在确认用户登录后,在中间件中,您只需检查用户是否具有所需的角色:$user->hasRole(['owner', 'admin']);。如果它返回 false 则抛出一个错误。
    • 某些路线所需的角色会有所不同;并且某些路由不需要整个路由保护,因此不幸的是,在中间件中覆盖它是行不通的。如果可能的话,我希望能够在路由文件中执行此操作;失败了,在控制器中。
    • 您可以为每个角色创建许多中间件(随着应用程序的增长不太容易维护)或pass parameters to middleware(我没有尝试过)。
    • 感谢您的意见,不幸的是我不认为这些解决方案是要走的路。
    【解决方案2】:

    已经有一段时间了,但我遇到了类似的问题。唯一不同的是,我的整个应用程序都必须受到保护。我最终修改了 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 保护您的路线。

    【讨论】:

      猜你喜欢
      • 2015-08-02
      • 2021-11-02
      • 2021-11-23
      • 2015-08-12
      • 1970-01-01
      • 2013-03-27
      • 1970-01-01
      • 2015-11-09
      • 2019-09-13
      相关资源
      最近更新 更多