6

アプリ

さまざまなユーザーが使用するWebアプリを実装する必要があります。各ユーザーは、さまざまなテーブルに対して異なる特権を持っています。

  • ユーザーAは、テーブルから「名前」と「アドレス」のフィールドを確認できます。Student
  • ユーザーBは、フィールド「名前」と「電話番号」を表示できますが、テーブルの「住所」は表示できません。Student
  • ユーザーCは、上記のすべてのフィールドを表示および変更できます

  • 特定のアクセスを制限するために、UIレベルで何かを用意します。たとえば、エントリを変更する権限を持たないユーザーの[編集]ボタンを非表示にします。ただし、データのセキュリティを確保するためだけに、より低いレベル(おそらくデータベースレベルで?)に何かを用意する必要があると思います。


    問題

    アプリにHibernate、JBoss、DB2、Strutsを使用しています。ユーザー/パスワード/ロールを使用してデータベースに対してユーザーを認証する、ある種のJBoss LoginModuleを使用する必要があると思います(ただし、間違っている可能性があります(?))。私はいくつかの調査を行い、次のオプションを考え出しましたが、どれも私の場合に当てはまらないようです。これは、マルチユーザーWebアプリで非常に一般的なデータアクセスの問題だと思います。誰かが私を正しい方向に向けてくれませんか?前もって感謝します!

    1. hibernate.cfg.xmlJACCイベントリスナーで「grant」タグを使用します。これにより、すべての休止状態エンティティに「挿入」「更新」「読み取り」権限を設定できます。ただし、より細かい制御が必要な場合はどうなりますか?オブジェクト全体ではなく、特定のフィールドにアクセス許可を設定する必要があります。http://www.hibernate.org/hib_docs/v3/reference/en-US/html/objectstate-decl-security.html

    2. 各ejbのgetter/setterメソッドの権限を制限します。これを正しく理解していれば、すべてのユーザープロファイルに対してすべてのBeanを手動で構成する必要がありますが、これは私には非現実的です。 EJBメソッドのアクセス許可

    3. DAOをコーディングして、ユーザー権限を確認します。ログインしたユーザーがアクションを実行できるかどうかを判断するために、特定のDAOメソッドが呼び出されるたびに巨大なアクセス許可テーブルをチェックする独自のユーティリティ関数をロールします。

    4. Hibernateで「インターセプター」と「イベント」を使用します。各クラスに特定の「onLoad」、「onSaveorUpdate」などのイベントとインターセプターを定義します。この場合、個々のフィールドに権限レベルを指定できますか?http://www.hibernate.org/hib_docs/v3/reference/en-US/html/objectstate-events.html

    間違った木に吠えているのかもしれません。上記のすべては労働集約的であり、あまりインテリジェントではないようです。上記のオプションはいずれも、実行時にユーザー権限をプログラムで変更する方法を提供しません。これは、管理者レベルのユーザーがこのアプリで別のユーザーにより多くの制御を与えたい場合に役立ちます。


    ここでデータアクセス制御を行うための良い方法は何ですか?

    4

    3 に答える 3

    3
    1. エンティティにセキュリティ キーを追加し、アクセス許可のテーブルを作成し、エンティティ タイプのアクセス許可を持つユーザーとロールを持つセキュリティ キーをリンクします。このようにして、次のように言うことができます: Admin_role は Student (エンティティ タイプ) にアクセスでき、read (Operation in Permission) と Write (Operation) を実行できますが、Student_role は Student_key と Read_permission にアクセスできます。アドレスをエンティティにリファクタリングし、セキュリティ キーを追加することで、アドレスを修正できます。

      1. 4 番目は、閉じた世界の仮定を持つことができ、ユーザーの現在の役割に対して、プロパティ名を辞書 (エンティティ + プロパティ) のフラグとリンクして、閉じた世界の仮定であるフラグにハッシュすることができないと言うことができます。デフォルトでは読み取りは許可されていません。もちろん、書き込み許可などは取得しません。

      2. データベースでビューを定義し、データベース認証システムを使用してそれらに権限を割り当てることができます。これは、自分でコーディングできる場合、おそらく最もクリーンな方法であり、ロールに応じて呼び出すビューを選択する方法です。(私の以前の RDBMS 教師は、私がこれを言ってくれることを喜んでくれるでしょう ;)) これはまた、Hibernate から少し離れて、あなたのものをよりデータベースに結合させます。それは、コードがどの程度移動可能/移植可能である必要があるかによって異なります。

      3. アクセス許可に基づいてクエリを書き換える一般的な dao (IRepository) に関する側面を使用します。もちろん、これはコードにアクセス許可ベースのセキュリティがあることを意味します。

    GUI に隠れている編集ボタンは、ポイント 1 のように、最初にアクセス許可をコードに移植した場合にのみ実行できます。このオープンソースの実装については、 Ayendes ブログを参照することをお勧めします。彼は非常に熟練しています。コーダー。

    于 2009-02-18T04:38:26.593 に答える
    2

    別のオプションとして、カスタム タイプを使用することもできます。たとえば、char を String にマッピングする代わりに、SecureString などのカスタム タイプにマッピングします。table.column など、マッピングで何らかの一意の識別子を持つパラメータを指定します。次に、カスタム タイプの nullSafeGet メソッドで、セキュリティ サービスを呼び出して、値を入力するか、単に null に設定するかを確認できます。ユーザーまたはロールを識別するために、ThreadLocal を使用して何かを格納する必要もあります。string、double、date、integer などをラップするカスタム タイプをいくつか作成するだけで済みます。同様のことを行って、日付をユーザーのタイム ゾーンに変換できるようにしました。

    于 2009-02-18T10:15:09.420 に答える