当我使用user()时如何在中间件中获取ID

时间:2019-04-14 18:44:56

标签: laravel relational-database laravel-middleware

我在用户和角色之间有关系。在中间件中,我需要获取角色以检查角色是1还是2。但是,出现以下错误。

  

“试图获取非对象的属性'role_id'。”

我确定我的role_id中有ID 1。

用户模型

public function role()
{
    return $this->belongsTo(Role::class, 'role_id');
}

public function handle($request, Closure $next)
{
    if (!Auth()->check() && $request->user()->role_id == 1) {
        return redirect()->back();
    }

    return $next($request);
}

2 个答案:

答案 0 :(得分:0)

您的if语句的逻辑是错误地检查用户是否登出,同时还检查用户的角色。如果Auth::check()false,则用户未登录,$request->user()将返回null

从条件中删除!将解决您收到的错误。

public function handle($request, Closure $next)
{
    if (Auth()->check() && $request->user()->role_id == 1) {
        return redirect()->back();
    }

    return $next($request);
}

但是,这将允许所有来宾继续,这是您可能不希望的。假设您希望中间件仅允许具有特定角色的登录用户继续,请使用更白名单的方法,如下所示:

public function handle($request, Closure $next)
{
    // Role ID 2 has permission to proceed
    if (Auth()->check() && $request->user()->role_id == 2) {
        return $next($request);
    }

    // Everyone else should go back, including logged-in users and guests.
    return redirect()->back();
}

答案 1 :(得分:0)

[无法发表评论,所以我要发布一个帖子。]

Aken已经回答了您,但我建议再做一件事。不要使用1或2作为ID,而是使用常量:

public function handle($request, Closure $next)
{
    if (Auth()->check() && $request->user()->role_id == ADMIN) {
        return $next($request);
    }

    return redirect()->back();
}

您甚至不需要对此发表评论。甚至更好:

public function handle($request, Closure $next)
{
    if (Auth()->check() && $request->user()->isAdmin()) {
        return $next($request);
    }

    return redirect()->back();
}

但是您需要自己实现。

相关问题