セキュリティ
|
|
 |
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層によってクレデンシャルが取り込まれ、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ドキュメントにあるので、そちらを参照してください。また、今回の例よりもっと洗練したやり方でセキュリティ例外を取り扱いたいかもしれません。
|
|