2017-04-03 11 views
1

私は、laravelアプリケーションで行ベースのアクセス制御を設定したいと考えています(現在5.2、5.5 ltsを待っています)。これはコントローラーで行うことができますが、フレームワークでそれを少し深くする方法があるのだろうかと思っていました。Laravelの行ベースのアクセス制御の結果

のは、これらのモデルがあるとしましょう:

P - project 
U - user (assigned to many projects) 
D - Device (assigned to one project) 
F - FAQ document (assigned to one project) 

現在ログインしているユーザーは、自分のプロジェクトに所属し、それらのデバイスとFAQドキュメントを参照してくださいする必要があります。

私の現在の試みはコントローラでこれを行うことです。現在のユーザーを取得し、一般的な「すべてのプロジェクトにアクセスする」権限を確認し、存在しない場合は、質問されたモデルのプロジェクトに参加して結果を制限します。これは、このモデルで実行されているすべてのクエリで複製する必要があり、私はこの種の冗長性が完璧ではないと感じています。

これらのモデルを強制するメソッドwithAccess()(私の例ではデバイスとFAQドキュメント)を使ってインターフェイス特性のようなものを作成する方法はありますか?このメソッドを実装し、モデル定義で一度クエリを実行しますか?

+0

私はミドルウェア(フィルタとして機能するシステムワイドミドルウェア)の作成を希望したいと思います。実際には、行ベースのアクセス制御によって何を意味するのか分かりませんでした。 – webDev

+0

私が理解しているように、ミドルウェアは、プロジェクトに属していないデバイスにアクセスしたい場合など、アクセスが全くない場合にリクエストをフィルタリングするのに適しています。しかし、デバイスのリストにアクセスする場合はどうすればよいですか?ミドルウェアはどのように役立つでしょうか? (例えば。結果セットをフィルタリングする) – McGo

+0

あなたはそのミドルウェアを使用して何もできません。成功すると、あなたのデバイスのリストを次のリクエストに渡して、コントローラまたはビューで取得します(次のページ) – webDev

答えて

3

私が考えることの1つは、各モデルに再利用可能な範囲を使用することです。

お使いのコントローラで

$devices = Device::ViewableDevices()->get(); 

とあなたのDeviceモデルに:

public function scopeViewableDevices($query) 
{ 

    return $query->whereHas('project', function($query) { 
     $query->whereHas('user', function($query) { 
      $query->where('user_id', Auth::user()->id); 
     } 
    }); 

} 

クエリはあなたが達成しようとしているどのようにあなたのデータが格納されているとロジックに比べて間違っているかもしれませんが、何私は範囲の意味は、デバイスのためのプロジェクトを見つけることです、その後、プロジェクトのユーザーを見つけ、それがログインしているユーザーに属しているかどうかを確認します。これが機能するために

あなたはセットアップにDeviceモデルでproject関係とProjectモデルでuser関係を必要とするだろう。

// Device.php 
public function project() { 
    return $this->hasOne('App\Project', 'id', 'project_id'); 
} 

// Project.php 
public function user() { 
    return $this->belongsTo('App\User', 'id', 'user_id'); 
} 

関係がオフになる場合もあり、私は常に注文が混ざっが、私は一般的に、彼らが動作することを確認するためにphp artisan tinkerを使用して取得します。

Scopes Docs

Relationship Docs

私がお勧めしたい唯一の他の事はあなたがインデックス(インデックスを?)持っていることを確認することです、あなたの外部キー列に、例えばproject_iduser_idなど、テーブルのサイズが大きい場合は、クエリのスピードアップに役立ちます。

+1

スコープは、素晴らしい、私はそれを読んでいるが、最初の段落は私が探していたものを正確に説明します。 – McGo

+0

問題はありません。時には、あなたが探しているものを見つけるために必要なものすべてが、喜んで役立ちます。 – martincarlin87

関連する問題