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