2016-09-28 123 views
7

我有一个具有以下实体/模型关系的多用户应用程序。Laravel在全球范围内访问已认证的用户

用户属于公司,有许多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. 是否可以在注册全局范围的引导方法中访问已通过身份验证的用户?

非常感谢任何和所有的回应。

+1

访问经过身份验证的用户。请检查此链接(https://laravel.com/docs/5.3/升级#5.3会话在构造函数)它谈论如何可以在控制器构造函数内手动调用中间件,也许你可以使用它来手动运行中间件... – Grigio

+1

[模型过滤器可能重复基于当前验证用户](https://stackoverflow.com/questions/47665819/model-filters-based-on-the-currently-authenticated-user) – Amade

+1

@谢谢你的指点。从那个问题,我找到了解决方案。它链接到[github上的全球范围问题](https://github.com/laravel/framework/issues/22316),它详细介绍了一个非常好的解决方案。 – biblicalPH

回答

0

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