![]() |
![]() |
![]() |
![]() |
このトピックでは、コールバック/イベント メソッドとそのハンドラ用のロール ベースのセキュリティを有効にする方法について説明します。
コールバックとイベント ハンドラは、イベントを送信できるロールを指定することによって保護できます。ロールは、@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 アノテーションだけがセキュリティを有効にします。 つまり、これらのアノテーションはコントロールのイベント セット メソッドには適用できません。
![]() ![]() |