Laravel访问全局范围内经过身份验证的用户

时间:2016-09-28 17:34:41

标签: php laravel-5.3

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

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

一家公司的用户不应该访问其他公司的支持票 - 如果一家公司的用户导航到指向另一家公司的支持票的网址,他们应该收到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. 是否可以在注册全局范围的引导方法中访问经过身份验证的用户?
  4. 非常感谢任何和所有回复。

3 个答案:

答案 0 :(得分:2)

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);
    }     
});

答案 1 :(得分:1)

如果您使用的是Tymon的JWT Auth软件包,则可以像这样获得auth用户

$(selector)

答案 2 :(得分:0)

在调用\ Auth :: user()之前,如果有经过身份验证的用户使用\ Auth :: check(),则可以在启动方法内部进行检查。 如果Auth中间件正在包装路由或控制器本身,那么您可以使用facade \ Auth :: user()

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