このトピックでは、コールバック/イベント メソッドとそのハンドラ用のロール ベースのセキュリティを有効にする方法について説明します。
コールバックとイベント ハンドラは、イベントを送信できるロールを指定することによって保護できます。ロールは、@ExternalCallbackTarget.CallbackSecurity アノテーションで指定します。
このアノテーションは、コントロール内のすべてのコールバック/イベント ハンドラに適用できます。そのためには、次のように、コントロール クライアントのコントロール フィールド宣言に上のアノテーションを追加します。
コントロール クライアント コード
@Control
@ExternalCallbackTarget.CallbackSecurity(rolesAllowed={"manager"})
private MyControl myControl;
特定のコールバック/イベント ハンドラ メソッドにこのアノテーションが配置された場合、コントロール フィールドに指定されているロールがオーバーライドされます。
@EventHandler(field="newsServiceControlOnlyManagers",
eventSet=controls.NewsServiceControl.Callback.class,
eventName="deliverManagerNews")
@ServiceControl.CallbackSecurity(rolesAllowed={"manager,editor,cityDesk"})
public void manager(String nf)
{
synchronized(flashes) { flashes.add(nf); }
}
コントロール/イベント ハンドラ セキュリティに参加するコントロールは、@ExternalCallbackTarget インタフェースの拡張でなければなりません。拡張するコントロール インターフェイス自体を使用して、コールバック/イベント ハンドラにアノテーションを追加することができます。たとえば、@ServiceControl は @ExternalCallbackTarget の拡張 (サブインタフェース) なので、次のコードは有効です。
@Control
@ServiceControl.CallbackSecurity(rolesAllowed={"manager"})
private MyControl myControl;
あるニュース リーダー クライアントが、メソッドを呼び出し、ニュース配信 Web サービスから中間サービス コントロールを介してコールバックを受け取るとします。
また、このニュース リーダー クライアントのユーザが以下の 3 種類存在するとします。
次の図に、このシナリオに含まれる 3 つのクラス (ニュース リーダー クライアント、中間コントロール、ニュース プロバイダ Web サービス) を示します。通常のメソッドは右矢印で示され、コールバックおよびイベント メソッド/イベント ハンドラは左矢印で示されています。

ニュース配信サービス SecureNewsService.java は、subscribe メソッドを通してユーザ資格を承認します。これらの資格は、ニュースをマネージャ、顧客、および匿名クライアントに配信することによって適切なコールバックを実行するために使用します。
@javax.jws.WebService
public class SecureNewsService implements java.io.Serializable {
@Callback
private CallbackSvc callback;
@javax.jws.WebMethod
public void subscribe(String username, String password) {
callback.setUsername(username);
callback.setPassword(password);
callback.deliverManagerNews("This is news for managers");
callback.deliverCustomerNews("This is news for customers");
callback.deliverAnonymousNews("This is news for anyone");
}
@CallbackService
public interface CallbackSvc extends CallbackInterface {
@WebMethod
void deliverCustomerNews(String news) throws java.rmi.RemoteException;
@WebMethod
void deliverManagerNews(String news) throws java.rmi.RemoteException;
@WebMethod
void deliverAnonymousNews(String news) throws java.rmi.RemoteException;
}
}
コントロールのイベント セット メソッドには、@ExternalCallbackTarget.ExternalCallbackEvent アノテーション、または @ServiceControl.ExternalCallbackEvent アノテーション (Web サービス コントロールの場合) を追加する必要があります。@ServiceControl.ExternalCallbackEvent アノテーションは、サービス コントロールが WSDL ファイルから生成されるときに自動的に追加されます。
@ControlExtension
public interface NewsServiceControl extends ServiceControl
{
@EventSet
public interface Callback extends ServiceControl.Callback
{
@ServiceControl.ExternalCallbackEvent
public void deliverAnonymousNews(java.lang.String news);
@ServiceControl.ExternalCallbackEvent
public void deliverCustomerNews(java.lang.String news);
@ServiceControl.ExternalCallbackEvent
public void deliverManagerNews(java.lang.String news);
}
public void subscribe(java.lang.String username_arg,java.lang.String password_arg);
}
NewsReaderClient.java クライアントには、コントロール タイプ NewsServiceControl.java のコントロール宣言が含まれています。
このコントロール宣言 (newsServiceControl) は、宣言レベルでは保護されません。代わりに、メソッド レベルで保護されます。このため、誰でも (認証されていないユーザも) 匿名ニュース配信にアクセスでき、マネージャだけがマネージャ ニュースを配信でき、顧客 (マネージャを含む) だけが顧客ニュースを配信できます。コールバック/イベントのセキュリティでは、誰がニュースを配信できるかを制約します (制約によってコールバック メッセージをイベント ハンドラに送信できるロールがフィルタ処理されるため)。誰がニュースを購読できるかについての制約は、@RolesAllowed アノテーションで行います。
@WebService
public class NewsReaderClient
{
@Control()
protected NewsServiceControl newsServiceControl;
@EventHandler(field="newsServiceControl",
eventSet=controls.NewsServiceControl.Callback.class,
eventName="deliverAnonymousNews")
@ServiceControl.CallbackSecurity(rolesAllowed={"Anonymous"})
public void deliverAnonymousNews(String news)
{
System.out.print(news);
}
@EventHandler(field="newsServiceControl",
eventSet=controls.NewsServiceControl.Callback.class,
eventName="deliverManagerNews")
@ServiceControl.CallbackSecurity(rolesAllowed={"manager"})
public void manager(String news)
{
System.out.print(news);
}
@EventHandler(field="newsServiceControl",
eventSet=controls.NewsServiceControl.Callback.class,
eventName="deliverCustomerNews")
@ServiceControl.CallbackSecurity(rolesAllowed={"customer"})
public void customer(String news)
{
System.out.print(news);
}
@WebMethod()
public String subscribeToNews(String username, String password)
{
newsServiceControl.subscribe(username,password);
newsServiceControlOnlyManagers.subscribe(username,password);
return "Subscribed for "+username;
}
}
上のサンプル コードの関連バージョンは、サンプル ワークスペースに含まれています。
以下に、ロール ベースのセキュリティを使用するコントロール拡張の条件を示します。
1. コントロールは、com.bea.control.ExternalCallbackTarget インタフェースを拡張する必要があります。サービス コントロールは、すでに ServiceControl (ExternalCallbackTarget のサブインタフェース) を拡張しているので、ExternalCallbackTarget を明示的に拡張する必要はありません。
2. コントロールの EventSet インタフェース メソッドには、次のアノテーションを追加する必要があります。
@ExternalCallbackTarget.ExternalCallbackEvent / @ServiceControl.ExternalCallbackEvent
3. コントロールのクライアントによって使用される @ExternalCallbackTarget.CallbackSecurity/@WebService.CallbackSecurity アノテーションだけがセキュリティを有効にします。つまり、これらのアノテーションはコントロールのイベント セット メソッドには適用できません。