16

私はすべてのリファレンス実装で Java EE 6 を使用しています。以下のすべてのページなど、一部のページにいくつかのセキュリティ制限を設けました/secure/*。これは大まかなセキュリティです。たとえば、2 人のユーザーが両方とも同じ役割を持っているが、同じページの一部のコンテンツをユーザー "John" だけに表示する必要がある場合はどうなるでしょうか? それとも、まったく別のページを「ジョン」に表示する必要がありますか? これについてはまだ答えられていない質問がたくさんあるので、誰かがこれをカバーするリンク/説明または本を提供してくれるとうれしいです. よりきめ細かいセキュリティ制御が必要です。

4

4 に答える 4

25

あなたが望んでいるきめの細かいセキュリティ機能が存在するだけでなく、Oracle には、この件について詳しく説明し、サンプル コードを完備した便利なブログ記事もあります。

そして、単純にドキュメントをリンクして実行するのは簡潔で無礼なので、以下は、これがどのように組み合わされるかについて、私の理解の範囲内で少し議論します.

0 番目の問題: 粗粒度の宣言型セキュリティ

宣言型セキュリティの最大の問題は、設計時にすべてのユーザー ロールを繰り返し定義しなければならないことです。これは2 つの理由から非常に望ましくありません。1 つ目は、セキュリティ モデルを実装から適切に抽象化できません (アプリケーションの将来性を十分に保証できず、情報漏えいの脆弱性への扉を開く)。2 つ目は、ユーザー ロールをアプリケーションの当面の設計では、要求または必要なときにきめ細かいアクセス許可またはACLを定期的に提供できません。

実際、これは不十分な抽象化の問題です。現在のニーズをすぐに満たすシステムを使用していますが、ロールがより複雑になり、コード ベースの複雑さが着実に増加しているため、アプリケーションのライフ サイクル全体にわたって実行可能または保守可能であると期待できるシステムではありません。

マネージド Bean を使用したきめ細かいセキュリティ

ここでの第一次の解決策は、各 JSF メソッド呼び出しのコンテキストで個別にユーザー ロールを定義できるようにする抽象化モデルを使用し、必要に応じてユーザー ロールをスワップインまたはスワップアウトできるようにすることです。おまけとして、これにより、ビューごと、エンドポイントごと、または Bean ごとではなくメソッドごとにパーミッションを定義できるため、よりきめ細かいパーミッションを定義できます。そして、役割が変わったら?各 Bean に移動してユーザー定義を交換するのではなく、単一の場所でパーミッション モデルを更新するだけで済みます。

前述の記事は、ここで取り上げるよりもはるかに詳細になっているため、ブログ投稿を読むことを強くお勧めします。ただし、ここでのポイントは、これを適切に行うには、認証スタックとアクセス許可の役割を詳述する注釈レイヤーの両方を提供する必要があり、2 つを明示的かつ意図的に接続した場所でのみ 2 つの関係が満たされるということです。

きめ細かいメソッド呼び出しと意味のあるセキュリティ ポリシーの定義は、読者の演習として残されていますが、この分野で質問がある場合は、コメントまたは一連のフォローアップの質問で遠慮なく質問してください。これらの質問は、本質的に幅広い聴衆にとって有用です。

改良点

このソリューションは、ニーズに対して十分に堅牢ではない可能性があります。たとえば、LDAPまたはKerberosを使用してユーザーを認証し、ユーザーとロールの統一された表現を提供したい場合、これはニーズを満たすための部分的なソリューションしか提供しません。このドメインにはいくつかの優れた リソースが存在しますが、それ以外は読者の演習として残します。

ここでの最終的なポイントは、完璧な世界では、これがアプリケーションのセキュリティを定義する方法であるということです。ニーズはさまざまで、小規模にとどめられているものについては、単純な宣言型セキュリティで十分にニーズを満たすことができます。結局のところ、それが存在し続けている理由です。

ただし、多数のユーザーのニーズを安全かつ正しく満たす必要がある大規模なアプリケーションの場合は、これが正しい方法です。もう少し知識とオーバーヘッドが必要ですが、適切に行うことから始めれば、時間、労力、フラストレーションを大幅に軽減できます。

いつものように、あなたのアプリケーションで頑張ってください.

于 2012-04-17T20:39:43.550 に答える
10

最も簡単なアプローチは

<h:panelGroup rendered="#{request.userPrincipal.name == 'user1'}">
    <p>Content for user 1</p>
</h:panelGroup>
<h:panelGroup rendered="#{request.userPrincipal.name == 'user2'}">
    <p>Content for user 2</p>
</h:panelGroup>
于 2012-04-14T19:49:02.867 に答える
4

同じページの複数のバージョンを表示することはセキュリティに関するものではなく (バージョンが異なる != リンクが非表示になる)、アクセスを制限し、追加の承認を必要とすることは、気にしない場合に回答します。

JAAS ページで両方 (認証、承認) について読むことができます。それはまた、私の意見では最高のフレームワークでもあります。マスターするには少し時間がかかりますが、その後は非常に簡単で、まったく重くはないことに気付くでしょう。すべての機能を使用する必要はありません. (EJBのように)

JAAS は、ldap または Windows アカウントを使用してもログに記録できます。複数の認証手順もサポートされています。pass+sms ログインを実装できます。もちろん、 acegiでもそれを行うことができます(それほど簡単ではありません)

すでに JSF について言及したので、JAAS は acegi よりもさらに適しています。任意のバッキング Bean に@RolesAllowedでアノテーションを付けることができ、ユーザー セッションが要件を満たしていない場合、SecurityException がスローされます。これは、jsps ではなく、サーブレットと Bean (ejb、バッキング) で機能します (ただし、とにかくあまり意味がありません)。

@RolesAllowedについてはこちらで読むことができますが、すでに検討している場合は、JBoss Seam Securityを見逃さないでください。これは、セキュリティ アノテーションと JAAS の両方の上に構築されており、使用すると中毒性があります。読む価値があります。

ところで、私は売春婦ではありません。興味深い質問を見つけたので...賞金のために自由に戦ってください:)

于 2012-04-18T23:33:33.000 に答える
1

通常、この種のコンテンツはセッション変数に保持されます。そのため、ログインしているユーザーについて考える必要はありません。

于 2012-04-16T03:58:39.163 に答える