Java EEでのセキュリティ保護されたエンタープライズBeansのビルド

NetBeans IDEではJava EE仕様がサポートされており、アプリケーション開発を簡単にするJava EEの数多くの機能を最大限に活用できます。Java EE 5仕様の大きな開発特長として、注釈が取り入れられています。注釈を使用すると、アプリケーションのコーディング時に使用する定型コードの多くを除外し、アプリケーションのデプロイ時に必要な構成の量を減らすことができます。

注釈の使用によって大幅に簡素化された領域として、エンタープライズBeansの開発と構成があります。以前はデプロイメント・ディスクリプタ・ファイルで指定していた多くの構成プロパティを注釈で指定できるので、多くのデプロイメント・ディスクリプタ・ファイルが不要になります。いくつかのデプロイメント・ディスクリプタ・ファイル(web.xmlなど)はまだアプリケーションに必要である場合がありますが、IDEのマルチビューのデプロイメント・ディスクリプタ・エディタによってファイルの編集が非常に簡単になっています。

注釈を使用すると、セキュリティ保護されたエンタープライズBeansを非常に簡単にビルドできます。エンタープライズBeanのセキュリティをejb-jar.xmlデプロイメント・ディスクリプタで構成するかわりに、セキュリティ注釈を使用して認証をソース・コード内で直接構成できます。Java EE 5のエンタープライズ・アプリケーションにはejb-jar.xmlまたはapplication.xmlは必要ありません。

Java EE仕様の特徴の概要については、Java EEテクノロジ入門を参照してください。注釈の仕様については、JSR 250: Javaプラットフォームの一般的な注釈を参照してください。

目次

このページの内容は、NetBeans IDE 7.2、7.3、7.4および8.0に適用されます

このチュートリアルに従うには、次のソフトウェアとリソースが必要です。

ソフトウェアまたはリソース 必須バージョン
NetBeans IDE 7.2、7.3、7.4、8.0、Java EEバージョン
Java Development Kit (JDK) バージョン7または8
GlassFish Server 3.1.x、4.x

このチュートリアルでは、GlassFishサーバーのローカル・インスタンスをIDEに登録する必要があります。IDEのJava EE版をインストールした場合、アプリケーション・サーバーはすでにインストールされ、登録されているはずです。アプリケーション・サーバーがIDEに登録されていない場合は、「ツール」>「サーバー」を選択してサーバー・マネージャでサーバーを登録します。Tomcat Webサーバーにエンタープライズ・アプリケーションをデプロイすることはできません。

前提条件

このドキュメントは、次のテクノロジについて基本的な知識またはプログラミング経験を持つ読者を想定して書かれています。

  • Javaプログラミング
  • NetBeans IDE

アプリケーション・サーバーへのセキュリティ・グループの作成

この例では、bank_usersグループのユーザーのみがエンタープライズBeanにアクセスできるようにします。アプリケーション・サーバーのfileセキュリティ・レルムでbank_usersグループ内にユーザーmanagerを作成します。

  1. 「サービス」ウィンドウでアプリケーション・サーバーのノードを右クリックして「起動」を選択し、サーバーを起動します。
  2. アプリケーション・サーバーのノードを右クリックし、「ドメイン管理コンソールの表示」を選択して、ブラウザでGlassFishサーバー管理コンソールを開きます。
  3. 左側のナビゲーション・バーで、「構成」ノードの下の「server-config」ノードを展開します。
  4. 「セキュリティ」>「レルム」>「file」をクリックして「レルムを編集」フレームを開きます。
    管理コンソールのナビゲーション・バーのスクリーンショット
  5. 「レルムを編集」パネルの上部にある「ユーザー管理」ボタンをクリックして、「ファイル・ユーザー」パネルを開きます。
    管理コンソールの「レルムを編集」パネルのスクリーンショット
  6. 「ファイル・ユーザー」パネルの「ファイル・ユーザー」表の上部にある「新規」ボタンをクリックします。
  7. 「新規ファイル・レルム・ユーザー」フォームに次のデータを入力します。「OK」をクリックします。
    名前
    ユーザーID manager
    グループ・リスト bank_users
    パスワード password

    フォームは次のイメージのようになるはずです。

    管理コンソールの新規ファイル・レルム・ユーザー・パネルのスクリーンショット

    「OK」をクリックすると、サーバーによってユーザーが作成され、「ファイル・ユーザー」パネルが開きます。managerという名前のユーザーがあることがわかります。

    管理コンソールのファイル・ユーザー・パネルのスクリーンショット

ユーザーが作成されたので、このユーザーがデータを参照できることを確認するエンタープライズ・アプリケーションを作成します。

リモート・インタフェース用のJavaクラス・ライブラリの作成

この課題では、セッションBean用のリモート・インタフェースを含む単純なJavaクラス・ライブラリ・プロジェクトを作成します。コンパイルされたクラス・ライブラリJARは、セッションBeanをコールするために使用されるEJBモジュールとアプリケーション・クライアントのクラスパスに追加されます。

  1. 「ファイル」>「新規プロジェクト」を選択し、「Java」カテゴリの「Javaクラス・ライブラリ」を選択します。「次」をクリックします。
  2. 「プロジェクト名」に「SecureRemoteInterface」と入力します。
  3. プロジェクトの場所を指定します。「終了」をクリックします。

次の項では、エンタープライズ・アプリケーション内にセッションBeanを作成します。このセッションBeanは、リモート・インタフェースを経由してアクセスされます。セッションBeanを作成すると、IDEによって自動的にクラス・ライブラリ内にリモート・インタフェースが作成され、エンタープライズ・アプリケーションのクラスパスにクラス・ライブラリJARが追加されます。

エンタープライズ・アプリケーションの作成とセキュリティ保護

このエンタープライズ・アプリケーションは、クラス・ライブラリ・プロジェクト内のリモート・インタフェースを経由してアクセスされる単純なセッションBeanで構成されます。

エンタープライズ・アプリケーション・プロジェクトの作成

この課題では、EJBモジュールを含むエンタープライズ・アプリケーションを作成します。

  1. 「ファイル」>「新規プロジェクト」([Ctrl]-[Shift]-[N]、Macの場合は[⌘]-[Shift]-[N])を選択し、「Java EE」カテゴリから「エンタープライズ・アプリケーション」テンプレートを選択します。「次」をクリックします。
  2. 「プロジェクト名」に「Secure」と入力し、「プロジェクトの場所」を設定します。
  3. 専用フォルダを使用するオプションが選択されている場合は選択解除します。

    このチュートリアルでは、ライブラリを他のユーザーまたはプロジェクトと共有する必要がないので、プロジェクト・ライブラリを専用のフォルダにコピーする理由はほとんどありません。

    「次」をクリックします。
  4. サーバーをGlassFishに設定し、Java EEバージョンをJava EE 6に設定します。
  5. 「EJBモジュールを作成」を選択し、「Webアプリケーション・モジュールを作成」を選択解除します。「終了」をクリックします。
管理コンソールの新規ファイル・レルム・ユーザー・パネルのスクリーンショット

セッションBean内のメソッドのセキュリティ保護

この課題では、EJBモジュール・プロジェクト内にセッションBeanを作成します。このセッションBeanでは、特別な処理は行いません。サンプルの残高を返すのみです。getStatusメソッドを作成し、@RolesAllowed注釈を付けることでメソッドBeanをセキュリティ保護し、メソッドへのアクセスを許可するセキュリティ・ロールを指定します。このセキュリティ・ロールはアプリケーションで使用され、サーバーのユーザーやグループと同じではありません。後でデプロイメント・ディスクリプタを構成するときに、セキュリティ・ロールをユーザーとグループにマップします。

セキュリティ注釈はクラス内のメソッドごとに、またはクラス全体に適用できます。この単純な課題では、@RolesAllowed注釈をメソッドに付けますが、Java EE仕様では、エンタープライズBeansで使用できるセキュリティ注釈が他にも定義されています。

  1. 「プロジェクト」ウィンドウでEJBモジュールのノード(Secure-ejb)を右クリックし、「新規」>「セッションBean」を選択します。
  2. Bean名に「AccountStatus」と入力し、パッケージに「bean」と入力します。
  3. インタフェースのタイプとして「プロジェクトでのリモート」を選択します。
  4. ドロップダウン・リストで「SecureRemoteInterface」を選択します。「終了」をクリックします。
    新規セッションBeanウィザードのスクリーンショット

    「終了」をクリックすると、IDEによってAccountStatusクラスが作成され、ファイルがソース・エディタで開きます。

    また、IDEによってSecureRemoteInterfaceクラス・ライブラリ・プロジェクト内のbeanパッケージのBeanのためにAccountStatusRemoteリモート・インタフェースが作成され、EJBモジュール・プロジェクトのクラスパスにSecureRemoteInterfaceクラス・ライブラリJARが追加されます。

    構造を示す「プロジェクト」ウィンドウのスクリーンショット

    EJBモジュールの「プロパティ」ダイアログ・ボックスの「ライブラリ」カテゴリを開くと、このJARがコンパイル時ライブラリに追加されていることがわかります。

  5. ソース・エディタで次のフィールド宣言(太字部分)をAccountStatusに追加します。
    public class AccountStatus implements AccountStatusRemote {
        private String amount = "250";
  6. ソース・エディタで、クラス内を右クリックして「コードを挿入」([Alt]-[Insert]、Macの場合は[Ctrl]-[I])を選択し、「ビジネス・メソッドを追加」を選択して「ビジネス・メソッドを追加」ダイアログ・ボックスを開きます。
  7. メソッド名に「getStatus」と入力し、戻り型をStringに設定します。

    ビジネス・メソッドが自動的にリモート・インタフェースに公開されます。

  8. ソース・エディタで次に示す太字の行をgetStatusメソッドに追加します。
    public String getStatus() {
        return "The account contains $" + amount;
    }
  9. 次に示す太字の部分を入力してgetStatusメソッドに注釈を付けます。
    @RolesAllowed({"USERS"})
    public String getStatus() {

    この注釈は、セキュリティ・ロールUSERSのユーザーのみがgetStatusメソッドにアクセスできることを示します。

  10. エディタ内を右クリックして「インポートを修正」([Alt]-[Shift]-[I]、Macの場合は[⌘]-[Shift]-[I])を選択し、変更内容を保存します。ファイルにjavax.annotation.security.RolesAllowedが追加されていることを確認します。

デプロイメント・ディスクリプタの構成

Java EEエンタープライズ・アプリケーションには通常、ejb-jar.xmlなどのデプロイメント・ディスクリプタ・ファイルは必要ありません。「Secure-ejb」または「Secure」エンタープライズ・アプリケーションの下にある「構成ファイル」ノードを展開すると、デプロイメント・ディスクリプタがないことがわかります。注釈を使用して、ejb-jar.xml内で構成されていたプロパティの多くを指定できます。この例では、セッションBean内で@RolesAllowed注釈を使用してEJBメソッドにセキュリティ・ロールを指定しました。

ただし、アプリケーションにセキュリティを構成するときは、デプロイメント・ディスクリプタでいくつかプロパティを指定する必要があります。この例では、エンタープライズ・アプリケーションで使用しているセキュリティ・ロール(USERS)を、アプリケーション・サーバーで構成したユーザーとグループにマップする必要があります。アプリケーション・サーバーにbank_usersグループを作成したので、このグループをエンタープライズ・アプリケーション内のセキュリティ・ロールUSERSにマップする必要があります。これを行うには、エンタープライズ・アプリケーション用のglassfish-application.xmlデプロイメント・ディスクリプタを編集します。

エンタープライズ・アプリケーションは、実行のためにデプロイメント・ディスクリプタが必要ないので、デプロイメント・ディスクリプタはデフォルトで作成されていません。そのため、最初にデプロイメント・ディスクリプタ・ファイルを作成し、次にそのファイルをマルチビュー・エディタで編集してセキュリティ・ロール・マッピングを構成する必要があります。

  1. 「Secure」エンタープライズ・アプリケーション・プロジェクトを右クリックし、「新規」>「その他」を選択して新規ファイル・ウィザードを開きます。

    または、メイン・メニューから「ファイル」>「新規ファイル」を選択して新規ファイル・ウィザードを開くこともできます。その場合は、必ず「プロジェクト」ドロップダウン・リストで「Secure」プロジェクトを選択してください。

  2. 「GlassFish」カテゴリで「GlassFishディスクリプタ」ファイル・タイプを選択します。「次」をクリックします。
    新規ファイル・ウィザードのスクリーンショット
  3. ウィザードのデフォルト値を受け入れ、「終了」をクリックします。

    「終了」をクリックすると、IDEによってglassfish-application.xmlが作成され、ファイルがマルチビュー・エディタで開きます。

    「プロジェクト」ウィンドウで「Secure」エンタープライズ・アプリケーション・プロジェクトのノードを展開すると、「構成ファイル」ノードの下にディスクリプタ・ファイルが作成されたことがわかります。

    ディスクリプタ・マルチビュー・エディタのスクリーンショット
  4. マルチビュー・エディタの「セキュリティ」タブで、「セキュリティ・ロール・マッピングの追加」をクリックし、「セキュリティ・ロール名」に「USERS」と入力します。
  5. 「グループを追加」をクリックし、ダイアログ・ボックスの「グループ名」に「bank_users」と入力します。「OK」をクリックします。

    エディタは次のようになっているはずです。

    ディスクリプタ・マルチビュー・エディタのスクリーンショット
  6. 変更を保存します。

マルチビュー・エディタ内の「XML」タブをクリックして、デプロイメント・ディスクリプタ・ファイルをXMLビューに表示できます。デプロイメント・ディスクリプタ・ファイルに次の内容が含まれることがわかります。

<glassfish-application>
  <security-role-mapping>
    <role-name>USERS</role-name>
    <group-name>bank_users</group-name>
  </security-role-mapping>
</glassfish-application>

これで、getStatusメソッドがセキュリティ保護され、サーバー上で指定したbank_usersグループ内のユーザーのみがこのメソッドにアクセスできます。

次に、セキュリティ設定をテストする手段が必要です。最も簡単な方法は、ユーザーにユーザー名とパスワードの入力を求める基本的なアプリケーション・クライアントを作成することです。

アプリケーション・クライアントの作成

この項では、AccountStatusセッションBeanにアクセスするための単純なアプリケーション・クライアントを作成します。リモート・インタフェース経由でBeanをコールするためにコード内で@EJB注釈を使用すると、アプリケーション・クライアントのクラスパスへのインタフェースを含むクラス・ライブラリJARがIDEによって自動的に追加されます。

  1. 「ファイル」>「新規プロジェクト」を選択し、「Java EE」カテゴリの「エンタープライズ・アプリケーション・クライアント」を選択します。「次」をクリックします。
  2. 「プロジェクト名」に「SecureAppClient」と入力します。「次」をクリックします。
  3. 「エンタープライズ・アプリケーションに追加」ドロップダウン・リストで「<なし>」を選択します。
  4. 「サーバー」ドロップダウン・リストで「GlassFish Server」を選択し、「Java EEバージョン」として「Java EE 6」または「Java EE 7」を選択します。「終了」をクリックします。

    「終了」をクリックすると、Main.javaがソース・エディタに表示されます。

  5. ソース・エディタでMain.javaファイル内を右クリックして「コードを挿入」([Alt]-[Insert]、Macの場合は[Ctrl]-[I])を選択し、「エンタープライズBeanをコール」を選択します。
  6. 「エンタープライズBeanをコール」ダイアログ・ボックスで、「Secure-ejb」ノードを展開し、「AccountStatus」を選択します。「OK」をクリックします。
    「エンタープライズBeanをコール」ダイアログ・ボックスのスクリーンショット

    セッションBeanを検索できるように、IDEによってアプリケーション・クライアントに次のコードが追加されます。

    @EJB
    private static AccountStatusRemote accountStatus;

    「プロジェクト」ウィンドウの「ライブラリ」ノードを展開すると、IDEによってSecureRemoteInterface JARがプロジェクトのクラスパスに追加されたことがわかります。

  7. mainメソッドを変更して次のコードを追加し、変更内容を保存します。
    public static void main(String[] args) {
        System.out.println(accountStatus.getStatus());
    }

アプリケーション・クライアントの詳細は、GlassFish Server上でのアプリケーション・クライアントの作成と実行を参照してください。

アプリケーションの実行

これでアプリケーションの準備が完了しました。まず、エンタープライズ・アプリケーションをサーバーにデプロイします。エンタープライズ・アプリケーションをデプロイした後、アプリケーション・クライアントを実行して、エンタープライズ・アプリケーション内のメソッドがセキュリティ保護されていること、およびユーザー・ロールが正しくマップされていることをテストできます。アプリケーション・クライアントを実行すると、bank_usersグループ内のユーザーのユーザー名とパスワードの入力を求められます。

  1. 「プロジェクト」ウィンドウで「Secure」エンタープライズ・アプリケーション・プロジェクトのノードを右クリックし、「デプロイ」を選択します。

    「デプロイ」をクリックすると、IDEはEARファイルをビルドし、アプリケーション・サーバーを起動し(実行されていない場合)、EARファイルをサーバーにデプロイします。

  2. 「プロジェクト」ウィンドウでSecureAppClientプロジェクト・ノードを右クリックし、「実行」を選択します。ユーザー名とパスワードの入力を求めるダイアログ・ボックスが表示されます。
    「ログイン」ウィンドウのスクリーンショット
  3. ダイアログ・ボックスでユーザー名(manager)とパスワード(password)を入力し、「OK」をクリックします。「出力」ウィンドウに次のように表示されます。
    The account contains 250$

この非常に基本的な例は、Java注釈を使用してエンタープライズBean内のメソッドをセキュリティ保護する方法を示しています。


関連項目

注釈およびデプロイメント・ディスクリプタを使用したエンタープライズBeanのセキュリティ保護の詳細は、次のリソースを参照してください。

NetBeans IDEを使用したJava EEアプリケーションの開発方法の詳細は、次のリソースを参照してください。

nbj2eeメーリング・リストに登録することによって、NetBeans IDE Java EE開発機能に関するご意見やご提案を送信したり、サポートを受けたり、最新の開発情報を入手したりできます。

get support for the NetBeans

Support


By use of this website, you agree to the NetBeans Policies and Terms of Use. © 2013, Oracle Corporation and/or its affiliates. Sponsored by Oracle logo