【问题标题】:Laravel access authenticated user in global scopeLaravel 在全局范围内访问经过身份验证的用户
【发布时间】:2020-02-01 12:32:25
【问题描述】:

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

用户属于一个公司并且有很多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. 是否可以在注册了全局作用域的引导方法中访问认证用户?

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

【问题讨论】:

标签: php laravel-5.3


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      如果你使用的是 Tymon 的 JWT Auth 包,你可以像这样获取 auth 用户

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

      【讨论】:

        猜你喜欢
        • 2016-11-11
        • 1970-01-01
        • 2016-01-15
        • 1970-01-01
        • 1970-01-01
        • 2013-08-20
        • 1970-01-01
        • 1970-01-01
        • 2017-01-17
        相关资源
        最近更新 更多