22

私はいくつかのACL要件を持つWebアプリケーションを作成しています。ユーザはいくつかのアイテムを変更できます。いくつかのアイテムはいくつかのユーザが編集可能で、管理者は何かを編集でき、マネージャは組織内のすべてを編集することができます。承認はモデルまたはコントローラの一部であるべきですか?

私はプレイを使用しています!フレームワークであり、Secureモジュールの外観では、認可の懸念を置く場所がコントローラにあるようです。ただし、認可の問題はビジネスロジックの一部であるため、モデルに含める必要があります。さらに、私はリファクタリングする必要があるコントローラーで重複したロジックが見え始めています。

一方、モデルに権限を追加すると、モデル内から現在のユーザーを取得する方法が必要になることを意味しますが、これは正しくないようです。代わりに、私はすべてのモデルメソッドに "current_user"パラメータを追加することができますが、それはさらに悪いようです。

だから、よくあることは何ですか?モデルに認証コードを入れることができますか、それともコントローラに保持することはできますか?

答えて

14

これは灰色の領域だと思います。ユーザーのアクセスは、HTTPの世界とオブジェクト指向の世界の間のマッピングの一部であると主張することができます。これはコントローラが意図しているため(静的な使用が多い)、着信要求を変換し、ドメインモデルでビジネスルールを処理できる状態にします。

特に、主にアノテーションレベルで管理されているため、コントローラロジックがモデルへのアクセスを制御するための正しい場所であり、認証がセキュリティクラスに抽象化されていることをお勧めします。

+7

だから、それは、グレーの領域、または絶対に正しいですか? :) – itsadok

+3

私の意見では、それは絶対に正しいと思う、しかし、それは灰色の領域であり、したがって解釈に開放されています。したがって、あなたが私の解釈に同意しているかどうかによって異なります。o) – Codemwnci

4

ほとんどの場合、セキュリティはモデルの上に1つ(またはそれ以上)のレイヤーである必要があります。セキュリティはそれ自身のドメインであり、下位層へのアクセスを制限します。

私はセキュリティがコントローラレベルで行われるべきではないと思います。私の意見で

、これはそのようになります。

表示 - >コントローラ - >セキュリティ - >モデル

セキュリティ層は、アクセスを保護し、モデルよりファサードまたはプロキシかもしれないが、コントローラーに対して透明であること。

ただし、ユーザーのアクセス権に応じてビューを変更する場合は、コントローラレベルでCheckModelのCanEditブール値プロパティの値を設定するなどのチェックが必要になることがあります。

+0

セキュリティと認可が混ざり合っています。セキュリティ上の懸念事項は、アプリケーションのすべてのレイヤーで処理する必要があります。問題は「セキュリティは許可されていない」ということです。 –

1

私は個人的には本当にプレイの方法が好きです!安全なモジュールがこれを処理します(the tutorial is ever-helpful here)。 @Beforeアノテーションを使用しても構わない場合は、かなり苦になります。

1

承認は、コントローラまたはドメインモデルの一部であってはなりません。

代わりに、サービスレイヤに存在する必要があります。

コントローラーは、HTTPとアプリケーションサービスの間でディスパッチャーとデリゲートとして機能するだけです。 オーケストレーションが行われるアプリケーションサービスです。これは認可を受けるための最良の場所です。

ユーザAがドメインXからのデータにアクセスする権限を持っているが、ドメインYからのデータの読み取りアクセスさえも許可されていないとします。承認がコントローラに置かれている場合、ユーザAはコントローラXで承認され、サービスコールを介してドメインYからのデータにアクセスすることができますが、これは期待したものではありません。

ドメインモデルはサービスレイヤー上で相互に通信するため、同じレベルで認可を行うことをお勧めします。

0

私はこの段階では午前と次のようにこれを処理しようとする:

  • JSいいえフォーム検証、代わりにHTTPS AJAX

  • AjaxのPHPのクラス

  • 経由フォームデータは具体的な検証のためのデータとしてモデルに送信されます
    電子メールやパスワードなどの一般的なタイプ(assoc配列の検証は他のクラスで再利用されるため、モデルエリア)。

  • エラーが資格情報のユーザーテーブル内のルックアップは、コントローラは、その後、生成

  • リセット、ログイン/サインアップ/パスワードなどの認証
    タイプのコントローラに渡さ/
    パスワードの資格情報を電子メールで送信しない場合必要な出力ビューまたはこれはlaravelに基づいて

セッションなどでログインしているユーザーを設定しますが、それはlaravelの独立したばかり緩くこのヴィータのために基づいて、欲しいと私は自分のライブラリを持っていますl要件。

モデルは、必要な資格情報をデータとして検索し、どのように処理するか気にしないので、コントローラに送信することが重要です。私はこれが、この領域を各コンポーネント間の決定的な責任とする唯一の方法だと思います。 MVCフレームワークと私の個人的な経験から

0

は、私が言う:それは純粋 する必要がありますし、任意の追加のロジックを含むべきではありません

  1. モデルは、データベーステーブルを表しているオブジェクトです。
  2. コントローラは、決定と他の カスタムロジックが行われる場所であるため、承認はコントローラ内になければなりません。それは は、ユーザーが許可されているかどうかを確認することができますいくつかのフックを設計することができます またはすべての必要な場所ではないので、コードの繰り返しDRYがありません。

  3. あなたは典型的な RESTアーキテクチャを使用している場合は、ユーザーに許可を与えるための最良の方法は、トークンを作るdatabseにして クライアント側でそれを保存し、すべての要求にこのトークンを検証することです。 ウェブブラウザアプリを使用している場合は、承認のためにサーバーサイドセッションを使用できます( )。

私は、承認ロジックをコントローラに保存することを提案します。

関連する問題