| JBoss EJB 3.0と拡張機能
セキュリティ
はじめに
| EJB 3.0コンテナの主要サービスのひとつに、アプリケーションを通じて一貫し、宣言的に設定されるセキュリティポリシーがあります。簡単なアノテーションを使って、各メソッド呼び出しに対するアクセス権を設定できます。このトレイルでは、EJB 3.0のセキュリティサービスを学びます。
パスワードファイル
| どのようなセキュリティ設定でも、まずユーザ名とそれに関連付けられたパスワード、ロールがどこにあるかをアプリケーションに伝えなければなりません。そのリストを格納するためにLDAPサーバやデータベースサーバを使うことができます。最も単純なケースでは、アプリケーションのクラスパスに置いたプレーンなテキストファイルを使うだけでもかまいません。次に示したのは`users.properties`ファイルです。これはユーザ名とパスワードのペアを格納します。この例では、2つのユーザアカウント、`admin`と`user`があります。
    admin=jboss
    user=ejb3
次は`roles.properties`ファイルです。これはユーザとセキュリティロールの関連を格納します。各ユーザは複数のロールを持つことができます。たとえば、`admin`ユーザは`AdminUser`ロールと`RegularUser`ロールの両方を持っています。
    admin=AdminUser,RegularUser
    user=RegularUser
サンプルアプリケーション
| 例として、パスワード保護された投資計算アプリケーションをやってみましょう。計算機能を使うためには`user`か`admin`としてログインする必要があります。今回は`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 Calculator.java: セッションBeanのインターフェース SecureCalculator.java: セキュリティアノテーションを付けたセッションBean実装 JSPユーザインターフェース calculator.jsp: `RegularUser`と`AdminUser`の両方が使えます addfund.jsp: `AdminUser`のみ使えます addinvestor.jsp: `AdminUser`のみ使えます
まとめ
| 管理されたセキュリティはEJB 3.0コンテナによって提供される重要なサービスのひとつです。このトレイルでは、プレーンテキストのパスワード/ロールリスト (すなわち`other`セキュリティドメイン)を使った例を見ました。実際のアプリケーションではおそらくセキュアなデータベースやLDAPサーバを使う必要があるでしょう。より多くの例がJBossドキュメントにあるので、そちらを参照してください。また、今回の例よりもっと洗練したやり方でセキュリティ例外を取り扱いたいかもしれません。