JBoss EJB 3.0と拡張機能

  セキュリティ
はじめに

EJB 3.0コンテナの主要サービスのひとつに、アプリケーションを通じて一貫し、宣言的に設定されるセキュリティポリシーがあります。簡単なアノテーションを使って、各メソッド呼び出しに対するアクセス権を設定できます。このトレイルでは、EJB 3.0のセキュリティサービスを学びます。

パスワードファイル

どのようなセキュリティ設定でも、まずユーザ名とそれに関連付けられたパスワード、ロールがどこにあるかをアプリケーションに伝えなければなりません。そのリストを格納するためにLDAPサーバやデータベースサーバを使うことができます。最も単純なケースでは、アプリケーションのクラスパスに置いたプレーンなテキストファイルを使うだけでもかまいません。次に示したのはusers.propertiesファイルです。これはユーザ名とパスワードのペアを格納します。この例では、2つのユーザアカウント、adminuserがあります。


admin=jboss
user=ejb3

次はroles.propertiesファイルです。これはユーザとセキュリティロールの関連を格納します。各ユーザは複数のロールを持つことができます。たとえば、adminユーザはAdminUserロールとRegularUserロールの両方を持っています。


admin=AdminUser,RegularUser
user=RegularUser
サンプルアプリケーション

例として、パスワード保護された投資計算アプリケーションをやってみましょう。計算機能を使うためにはuseradminとしてログインする必要があります。今回はuserでログインしてみましょう (パスワードはejb3です)。

RegularUserは計算機能を使えますが、投資会社と投資家のプロフィールを追加できるのはAdminUserだけです。なので、次の2つのプログラムをuserユーザで実行した場合、セキュリティ例外に出くわすでしょう。今度はadminユーザ (パスワードはjbossです)でログインしてみてください。

セキュリティアノテーション

EJB 3.0では、セキュリティアノテーションを使ってパスワード/ロールリストの場所とどのユーザロールがメソッドへのアクセスを許されているかを指定することができます。次のコード例では、現在のクラスパスにある.propertiesファイルが認証に使用されることを、@SecurityDomain("other")アノテーションで示しています。@RolesAllowedアノテーションは各メソッドに対して許可されるロールを指定します。@PermitAllアノテーションが付けられたメソッドはセキュリティ制約でチェックされません。


@Stateless
@SecurityDomain("other")
public class SecureCalculator implements Calculator {

  @RolesAllowed({"AdminUser"})
  public void addFund (String name, double growthrate) {
    // ... ...
  }

  @RolesAllowed({"AdminUser"})
  public void addInvestor (String name, int start, int end) {
    // ... ...
  }

  @PermitAll
  public Collection <Fund> getFunds () {
    // ... ...
  }
  
  // ... ...

  @RolesAllowed({"RegularUser"})
  public double calculate (int fundId, int investorId, 
                                       double saving) {
    // ... ...
  }
}
Web層の設定

Webページからシステムにログインすると、アプリケーションのWeb層によってクレデンシャルが取り込まれ、EJB 3.0のミドルウェア層に渡されます。どのページがパスワードによって保護され、どのロールが各ページに対して許可されているかを宣言するために、web.xmlファイルを設定しなければなりません。web.xmlファイルの内容を次に示します。


<web-app>
  <display-name>EJB3Trail</display-name>

  <security-constraint>
      <web-resource-collection>
         <web-resource-name>
            The Protected Calculator
         </web-resource-name>
         <url-pattern>services/security/addfund.jsp</url-pattern>
         <url-pattern>services/security/addinvestor.jsp</url-pattern>
         <url-pattern>services/security/calculator.jsp</url-pattern>
      </web-resource-collection>

      <auth-constraint>
         <role-name>AdminUser</role-name>
         <role-name>RegularUser</role-name>
      </auth-constraint>

      <user-data-constraint>
         <transport-guarantee>NONE</transport-guarantee>
      </user-data-constraint>
   </security-constraint>

   <security-role>
      <description>Authorized to access everything.</description>
      <role-name>AdminUser</role-name>
   </security-role>
   <security-role>
      <description>Authorized to limited access.</description>
      <role-name>RegularUser</role-name>
   </security-role>

   <login-config>
      <auth-method>FORM</auth-method>
      <form-login-config>
         <form-login-page>security/login.html</form-login-page>
         <form-error-page>security/loginFailed.html</form-error-page>
      </form-login-config>
   </login-config>

</web-app>
ソースコード参照

セッションBean

JSPユーザインターフェース

まとめ

管理されたセキュリティはEJB 3.0コンテナによって提供される重要なサービスのひとつです。このトレイルでは、プレーンテキストのパスワード/ロールリスト (すなわちotherセキュリティドメイン)を使った例を見ました。実際のアプリケーションではおそらくセキュアなデータベースやLDAPサーバを使う必要があるでしょう。より多くの例がJBossドキュメントにあるので、そちらを参照してください。また、今回の例よりもっと洗練したやり方でセキュリティ例外を取り扱いたいかもしれません。