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

标签 php laravel-5.3

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

用户属于公司并且有很多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() 来确定当前用户是否已经通过身份验证,而无需查询数据库中的用户模型。您可以在 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);
    }     
});

关于php - Laravel 在全局范围内访问经过身份验证的用户,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39754167/

相关文章:

laravel - 错误 :Your requirements could not be resolved to an installable set of packages.(在服务器上)

php - laravel 查询中具有 where 条件的数组值

Laravel 广播不向推送器发送事件

php - 在 laravel 的每个方法中添加一个变量

php - 为什么在 PHP 中需要抽象类?

php - PHP 中的数据库类;只有一个功能 - 关于实践的问题以及它是否是一个好主意

php - 如何在laravel Eloquent 更新查询中更新表字段=字段+1

php - 键存在于数组中时出现未定义索引错误

php - SELECT JOIN 在同一表中多行

php - Laravel 测试未定义的方法