質問

Acegi(Spring)セキュリティを使用したロールベースのアクセス制御を備えたwebappを構築しています。だから私はロールを持つ異なるユーザーを持っています: ROLE_ADMIN ROLE_USER など
ただし、さまざまなユーザー制約を実装する必要があります。

例を考えてみましょう:

  

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

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

ありがとう。

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

編集2

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

すべての提案をありがとう!

役に立ちましたか?

解決

私は、宣言型のロールベースのセキュリティシステムがあなたが求めているきめ細かい制御を与えるとは期待していません。すでにかなりの数の「ビジネスルール」について説明しました。実装するベースのアクセス制御。これらのルールは徐々に複雑になることが予想されます。したがって、セキュリティサブシステムからの情報の組み合わせ(このリクエストのユーザーは誰ですか?どのような役割がありますか?)が必要ですこの範囲内にあります)。

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

他のヒント

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

各トピック(たとえば、視聴できる映画の制限)を考慮すると、これを実装する方法は非常に多くあり、機能的な選択を行う必要があります。実行する必要があることを詳細に既に決定していない限り、正しい実装はできません!

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

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

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

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

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

Spring Securityを検討する場合、これはソリューションを実装できる方法の1つです。 AccessDecisionVoter を実装して、ユーザーのアクセスを決定します。リファレンスソースこちら

AccessDecisionVoter の[javadoc] [2]も参照してください。 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)

認証のニーズと承認のニーズがあるように聞こえます-多くの場合、人々は2つを混乱させたり参加させたりします。ありがたいことに、Spring Securityはこの2つを非常にうまく描写しています。ユーザーはセキュリティチェーン(logj、openID、SSL X509など)を介して認証され、割り当てられた番号を見たかどうかについて、ビジネス固有の投票者(AccessDecisionManagers内)によって承認されると完了します。映画の。新しいビジネスロジックを後で追加する必要がある場合は、単に新しい/より多くの投票者を作成し、それらをマネージャーに投入するだけです。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top