4

Acegi (Spring) セキュリティを使用して、ロール ベースのアクセス制御を備えた Web アプリケーションを構築しています。したがって、ロールを持つさまざまなユーザーがいます: ROLE_ADMINROLE_USERなど。
ただし、さまざまなユーザー制約を実装する必要があります。

例を考えてみましょう:

ユーザーがオンラインで映画を視聴できるサイトがあるとします。と の役割ROLE_STANDARD_USERを持つユーザーがいますROLE_VIP_USER。標準ユーザーは週に 3 本の映画を視聴でき、VIP ユーザーは週に 10 本の映画を視聴でき、その他の特典もいくつかあります。また、標準ユーザー グループには、1 週間に 2 本の映画を追加で提供したいユーザーが 1 人います。許可される動画の数は変更される場合があります。
また、映画にはさまざまなカテゴリがあります。ファンタジー、コメディ、クラシック、新しい映画などです。役割に関係なく、一部のユーザーが特定のカテゴリにのみアクセスできるようにしたいと考えています。カテゴリは動的に作成および削除できます。

このようなタイプのユーザー制約を実装するための標準的な方法はありますか?
Spring Security のロールとパーミッションを使用して実行できますか?
または、ルール ベースのエンジンをアプリに追加することを検討する必要がありますか?

ありがとうございました。

編集:
上記の例は架空のものです。私のプロジェクトは、学生にさまざまなネットワーク (およびその他の) 機器へのリモート アクセスを許可することに関係しています。ただし、ユーザー制約の種類は同じである可能性があります。
残念ながら、ユーザー アクセスと制約のモデルは完全ではなく、安定していません。近い将来、ユーザーにさまざまな追加の制約を実装するように言われるかもしれませんが、それは現在知られていません。
したがって、将来的に新しいユーザー制約の追加または変更が容易になり、内部モデルやデータベース構造の大幅なオーバーホールを必要としないパスを選択したいと思います。それができれば。

編集 2

現在、基本的なユーザー制約はハードコーディングされています (プロトタイピング システムの残り物)。最初に何らかのパラメーター化されたビジネス サービス オブジェクトにリファクタリングしてから、そこからどこへ行くことができるかを考えてみようと思います。また、Spring Security Authorization Decision Manager の使用も検討します。

すべての提案に感謝します!

4

5 に答える 5

4

宣言型の役割ベースのセキュリティシステムが、あなたが求めているきめ細かい制御を提供することは期待していません。実装したい「ビジネスルール」ベースのアクセス制御についてはすでに説明しましたが、時間の経過とともにこれらのルールはより複雑になると予想されます。したがって、セキュリティサブシステムからの情報の組み合わせ(このリクエストのユーザーは誰ですか?彼らにはどのような役割がありますか?)が必要ですが、プログラムでそれをビジネスデータおよびルールと組み合わせます(このユーザーは、今日の日付の場合、2本の無料映画に誘われますこの範囲内です)。

少なくとも、そのビジネスロジックをカプセル化するサービスを定義します。本格的なルールエンジンを使用するかどうかの決定には、さらに調査が必要です。

于 2009-10-26T09:55:03.840 に答える
1


Acegi(またはルールエンジンなど)が正しい場所であると自問する前に、ニーズを正確かつ完全に分析する必要があると思います。

各トピック(たとえば、見ることができる映画の制限)を考慮すると、これを実装する方法は多数あり、機能を選択する必要があります。何をしなければならないかを詳細に決定していない限り、正しい実装はあり得ません。

ニーズに合ったモデルの例:

  • 以下の合計に従って、1週間あたりの一般的な映画の数を制限します。
    • 役割(3または10)
    • ユーザーごとのボーナス(言及されていない場合はデフォルト0)
  • 必要に応じてこれらの番号を更新してください
  • 映画をカテゴリのリストに制限します。
    • ユーザーにリストが指定されている場合は、それを使用します
    • それ以外の場合は、役割に提供されているリストを使用してください

この例には多くの意味がありますが、あなたの場合は正しいか受け入れられない可能性があります。
意味:

  • 番号を更新すると、すぐに制限が変更されます。
  • 週ごとの制限の記憶はありません。過去についてこれを尋ねることはできません(たとえば、統計を作成するため)
  • ..。

このモデルがあなたのニーズに合わないとしたら、あなたは本当に彼らに合うモデルを作るという大変な仕事に直面しています。一度それを手に入れたら、実装について考えてください。

于 2009-10-26T09:52:58.830 に答える
1

Spring Security を検討している場合、これはソリューションを実装できる 1 つの方法です。AccessDecisionVoterユーザーのアクセス権を決定する を実装します。参考元はこちらをご覧ください

の [javadoc][2] も参照してくださいAccessDecisionVoter。メソッドを実装することで、ルールを実装できますvote

int vote(Authentication authentication,
         Object object,
         ConfigAttributeDefinition config)

Spring にアクセス (認証と承認) を処理させます。意思決定が複雑になる場合は、ルール エンジンを使用するのが賢明かもしれません。投票メソッドがルール エンジンを呼び出すようにします。これにより、明確な義務の分離が提供されます。Spring Security にアクセスを処理させ、ルール エンジンにルールを計算させます。

[2]: http://static.springsource.org/spring-security/site/apidocs/org/springframework/security/vote/AccessDecisionVoter.html#vote(org.springframework.security.Authentication , java.lang.Object, org.springframework.security.ConfigAttributeDefinition)

于 2009-10-27T04:17:45.367 に答える
0

認証の必要性と承認の必要性があるように思えます - 多くの場合、人々はこの 2 つを混同したり、結合したりします。ありがたいことに、Spring Security はこの 2 つを非常によく描写しています。ユーザーはセキュリティ チェーン (logj、openID、SSL X509 のいずれか) を介して認証され、割り当てられた番号を既に確認したかどうかについて、ビジネス固有の有権者 (AccessDecisionManagers 内) によって承認されます。映画の。後で新しいビジネス ロジックを追加する必要がある場合は、新しい/より多くのボーターを作成し、マネージャーに注入するだけです。

于 2009-10-26T17:33:03.593 に答える