認証と承認を実装するための最良のソリューションを考え出すために、私は一日中グーグルで検索し、ここでさまざまな質問を調べてきました。私は今、解決策の一部を考え出しましたが、誰かがギャップを埋めることができることを望んでいます. 以下にたくさんのテキストがあることは承知していますが、ご容赦ください:O)
バックグラウンド
私は、現在 JSF 2.0、JavaEE 6、JPA、および PostgreSQL データベースを使用している部分的に完成した CRM アプリケーションを継承しました。残念ながら、元々この Web アプリを無限の知恵で構築し始めた人たちは、認証/承認を最後まで残すのが最善であると判断しました。
アプリケーションは基本的に、ビュー、マネージド Bean、および DAO の 3 つのレイヤーに分割されます。これは、ビジネス ロジック、検証、およびナビゲーション ロジックのすべてが含まれているマネージド Bean が特に「太い」ことを意味します。
認証/承認の要件
- PostgreSQL データベースに保存されている資格情報に対して検証するフォーム ベースの認証。
- 一般に (匿名ユーザーが) アクセスできる唯一のページは、ログイン ページです。
- ユーザーの役割に基づいて、アプリケーションの特定の領域へのアクセスを防止する必要があります。たとえば、「管理者」ロールを持つユーザーのみが、ユーザーの作成/編集ページにアクセスできる必要があります。
- また、ページの特定の領域へのアクセスを制限できるようにする必要もあります。たとえば、「営業担当者」の役割を持つユーザーは顧客の詳細を表示できる必要がありますが、保存/編集ボタンはユーザーが「顧客サービス」の役割を持っている場合にのみ表示する必要があります。
私がいるところ
私が最初に計画していることは、 JAAS とサーブレット 3.0 ログインの例を使用したこのユーザー認証と承認に従うことです。これで、最初の 3 つの要件を満たすことができると思います。
ページの保存ボタンなどを表示/非表示にするために、この SO answerで説明されている手法を使用できます。これにより、要件 4 は部分的に解決されますが、アクション メソッドやマネージド Bean 自体を保護する必要があると思います。たとえば、カスタマー Bean の save() メソッドに注釈または何かを追加して、「カスタマー サービス」ロールを持つユーザーのみが呼び出しできるようにしたいと考えています。ここで問題が発生し始めます。 .
ビューで提案していることと同様のことを行い、facesContextを使用して現在のユーザーが「役割を果たしている」かどうかを確認するのが1つのオプションだと思います。コードが乱雑になり、代わりに注釈を使用したいので、私はこれに熱心ではありません。ただし、このルートをたどった場合、http 403 ステータスを返すにはどうすればよいでしょうか?
javax.annotation.security.* アノテーションは、アプリケーションの領域へのアクセスを宣言的に定義するのに適しているようですが、私が理解している限り、それらは EJB にのみ追加できます。これは、すべてのビジネス ロジックを、現在存在するマネージド Bean から新しい EJB に移動する必要があることを意味します。これには、ビジネスロジックを独自のクラスセット (デリゲート、サービス、またはそれらを呼び出すために選択したもの) に分離するという追加の利点があると思います。これは非常に大規模なリファクタリングになりますが、単体テストや統合テストの欠如によって支援されることはありません。アクセス制御の責任がこの新しいサービス レベルにあるのかどうかもわかりません。管理対象の Bean にあるはずだと思います。
その他の代替手段
調査中に、多くの人が Spring や Seam などのフレームワークについて言及しているのを見つけました。Seam の経験は限られています。Seam はこのプロジェクトにぴったりだったと思います。思い出す限りでは、私が抱えている承認の問題は解決すると思いますが、今すぐ導入するには遅すぎると思います。 .
いろいろなところでシロが言及されているのも見ました。10 分間のチュートリアルを見たところ、これは特にDeluan Quintao の taglibと組み合わせるとぴったりのように思えましたが、JSF Web アプリと統合する方法のチュートリアルや例を見つけることができませんでした。
私が驚くほど頻繁に遭遇するもう 1 つの選択肢は、カスタム ソリューションを実装することです。
概要
要約すると、認証と承認の実装に関して正しい道を進んでいるかどうか、および個々のメソッドやマネージド Bean (または少なくとも委任先のコード) および/または HTTP ステータス 403 を手動で返す方法。