2016-09-28 38 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()