Laravel访问全局范围内的认证用户


Laravel access authenticated user in global scope

我有一个具有以下实体/模型关系的多用户应用程序。

用户属于公司,并且有多个SupportTicket

一个公司的用户不应该访问其他公司的支持单——如果一个公司的用户导航到指向另一个公司的支持单的url,他们应该收到404或类似的东西。

我希望在SupportTicket类中定义一个全局作用域,如下所示:
class SupportTicket extends Model {
    protected $fillable = ['company_id'];
    public static function boot() {
        static::addGlobalScope('ofCompany', function(Builder $builder) {
            $authUser = auth()->user();
            $builder->where('company_id', $authUser->company_id);
        });
    }
}

全局作用域的好处是它适用于所有查询。在项目上工作的其他开发人员在检索门票时不需要工作,因为总是会返回正确的结果。

例如,SupportTicket::all()SupportTicket::find(5)将始终限制用户公司的访问。

我现在面临的挑战是auth()->user()总是返回null,因为认证中间件尚未运行。

  1. 有办法解决这个问题吗?
  2. 这里有人遇到过类似的问题吗?如果有,他们是如何解决的?
  3. 是否可以在注册全局作用域的引导方法中访问经过认证的用户?

提前感谢任何和所有的回应。

Laravel 5.6.26引入了Auth::hasUser()来确定当前用户是否已经通过身份验证,而无需查询数据库中的user模型。您可以在https://laravel-news.com/laravel-5-6-26找到更多详细信息

你可以这样做:

static::addGlobalScope('ofCompany', function(Builder $builder) {
    if( auth()->hasUser() ){
        $builder->where('company_id', auth()->user()->company_id);
    }     
});

在调用'Auth::user()之前,您可以在引导方法内部检查是否有经过身份验证的用户使用'Auth::check()。如果Auth中间件正在封装路由或控制器本身,那么您可以使用facade 'Auth::user()

在任何地方访问经过身份验证的用户

如果您正在使用Tymon的JWT授权包,您可以像这样获得授权用户

$authUser = 'JWTAuth::parseToken()->authenticate();