2016-09-28 12 views
7

次のエンティティ/モデルの関係を持つマルチユーザーアプリケーションがあります。ラーバルアクセスグローバルスコープ内で認証されたユーザー

ユーザー会社に所属し、多くを持っている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()

  1. 方法はありますか?
  2. ここで誰も似たような問題に直面していますか?
  3. グローバルスコープが登録されているブート方法で、認証されたユーザーにアクセスできますか?

すべての回答に事前に感謝します。

+1

このリンクをチェックしてください(https://laravel.com/docs/5.3/)コントローラコンストラクタ内でミドルウェアを手動で呼び出す方法について説明します。おそらく、ミドルウェアを手動で実行するために使用できます... – Grigio

+1

[現在認証されているモデルフィルタを複製する]ユーザー](https://stackoverflow.com/questions/47665819/model-filters-based-on-the-currently-authenticated-user) – Amade

+1

@Amadeそれを指してくれてありがとう。その質問から、私は解決策を見つけました。これは、githubのグローバルスコープ問題(https://github.com/laravel/framework/issues/22316)にリンクしています。 – biblicalPH

答えて

0

\ Auth :: user()を呼び出す前に\ Auth :: check()を使用して認証されたユーザーがいる場合は、ブートメソッドをチェックすることができます。 Authミドルウェアがルートまたはコントローラ自体をラップしている場合は、facade \ Auth :: user()を使用して認証されたユーザーにアクセスできます。

関連する問題