2017-03-17 4 views
-2

たとえば、ユーザーが使用する権利の対象となるモデルはありますが、ビジネスロジックで使用されるモデルはありません。 exempleについてはMVCソフトウェアアーキテクチャーに権利管理ロジックを配置する場所

:1の項目Aを作成すると 、それがautomaticaly彼がものを作成したい場合

ユーザーがAまたはBを作成する権限を持っている必要があります項目Bを作成します。 しかし、AからBを作成する際のビジネスロジックには、いかなる権利も必要ありません。

私はビジネスロジックに適切なシステムを置くと、セッションに強い依存関係を持つクラスを取得し、ログインしたユーザーには権利がない場合、AはBを作成できません。

権利管理をコントローラーに置くと、プログラマーがアイテムを作成する前に権利をテストするのを忘れる可能性があるため、ビジネスロジックが安全でないように感じられます。また、コントローラが2つあればコードの重複もあります。何らかの理由でアイテムを更新する。

あなたはどこに権利管理を入れますか?

私は、コントローラによって使用されるすべてのオブジェクトの継承を作成し、権利制限を実装しますが、ビジネスロジックはオブジェクト自体にアクセスします。コントローラはUserA、UserBを作成し、オブジェクトAはBオブジェクトを直接作成します。 しかし、私はコントローラーで使用する必要があるすべての単一のビジネスロジックオブジェクトを複製(継承)しなければならないように思えます。ここで

+0

あなたはあなたのクラスの具体的な例を置く必要があるようなことがあります。 Aはユーザーモデルですか? –

+0

ミドルウェアはありますか?サービスを使用してコードを共有することもできます – Farkie

答えて

-1

は例です:

<!-- language: php --> 
//abstact Model 
abstract class Models { 
    public function save() { 
     if($this->id === null) { 
      $this->insert(); 
     } else { 
      $this->update(); 
     } 
    }  

    abstract protected function insert() { 
     //insertion in DB 
    }  

    abstract protected function update() { 
     //update in DB 
    } 
}  


//A Model 
class A extends Model { 
    protected function insert() { 
     //check if logged in user can insert A objects otherwise throw an exception 
     //insert in DB  

     $b = new B; 
     //set $b datas 
     $b->save(); 
    }  

    protected function update() { 
     //check if logged in user can update A objects and has rights on instanciated A otherwise throw an exception 
     //update in DB 
    } 
}  

//B Model 
class B extends Model { 
    protected function insert() { 
     //check if logged in user can insert B objects otherwise throw an exception 
     //insert in DB 
    }  

    protected function update() { 
     //check if logged in user can update B objects and has rights on instanciated B otherwise throw an exception 
     //update in DB 
    } 
}  

//A Controller 
class AController() { 

    public function createA() { 
     $a = new A; 
     //set $a datas 
     $a->save() 
    }  

    public function updateA($id) { 
     $a = new A($id); 
     //set new $a datas 
     $a->save() 
    } 
}  

//B Controller 
class BController() { 

    public function createB() { 
     $b = new B; 
     //set $b datas 
     $b->save() 
    }  

    public function updateB($id) { 
     $b = new B($id); 
     //set new $b datas 
     $b->save() 
    } 
} 

私はモデル内の検証を続ける場合は、ユーザーがすることはできませんが、それはでBを作成し、ユーザーではないとして、それは必要がある場合、オブジェクトAがオブジェクトBを作成することはできません。この例では、Aコードによるビジネスロジックです。

コントローラーに入れるためにモデルから検証すると、私は確かに検証を忘れてしまうプログラマーに曝され、異なるコントローラーがアイテムを更新する際に多くの重複が生じる可能性があります。

は、これまでのところ私は考えについて:

  • 1つのPuting権コントローラでチェックしますが、ユーザーを注入
  • 2安全な音ではありませんが、私は「上のすべての権限」を作成する必要があると思いますこれらのアイデアのデフォルトではfalseが、権利の確認

を乗り越えるために、ビジネスロジックによってtrueとして設定なしないだろうなセーブ()メソッドの$ norightsオプションを追加するビジネスロジックによって

  • 3を使用されるユーザーsのフルは、さまざまな理由のために私を満たす:

    • 1非安全モデル1は、チェックを忘れてしまった場合
    • 2スーパーユーザーは
    • 3が汚れ
  • 0

    の音は非常に良い鳴っていない私はあなたを提案しますララベルを同じものに使うこと。 Laravelはルートファイルで指定する必要があるミドルウェアを提供します。そのため、コントローラが呼び出されるたびに、最初にミドルウェアを呼び出してから、コントローラに転送されるすべての条件がチェックされます。

    ミドルウェアでは、役割と権限または必要な権限をチェックする1つのクラスファイルを作成できます。

    あなたはhttps://heera.it/laravel-5-1-x-acl-middleware

    を参照したり、AとBクラスが何であるかを理解することは本当に難しい..ですhttps://github.com/Zizaco/entrust#user-relation-to-roles

    関連する問題