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,因为验证中间件尚未运行。
- 有没有办法解决这个问题?
- 有没有人在这里遇到过类似的问题,如果是的话他们是怎么回事?
- 是否可以在注册全局范围的引导方法中访问已通过身份验证的用户?
非常感谢任何和所有的回应。
访问经过身份验证的用户。请检查此链接(https://laravel.com/docs/5.3/升级#5.3会话在构造函数)它谈论如何可以在控制器构造函数内手动调用中间件,也许你可以使用它来手动运行中间件... – Grigio
[模型过滤器可能重复基于当前验证用户](https://stackoverflow.com/questions/47665819/model-filters-based-on-the-currently-authenticated-user) – Amade
@谢谢你的指点。从那个问题,我找到了解决方案。它链接到[github上的全球范围问题](https://github.com/laravel/framework/issues/22316),它详细介绍了一个非常好的解决方案。 – biblicalPH