前 次 前/次ボタンと目次ボタンとの区切り線

外部イベントと外部コールバックのセキュリティ

このトピックでは、コールバック/イベント メソッドとそのハンドラ用のロール ベースのセキュリティを有効にする方法について説明します。

コールバックとイベント ハンドラに対するロール アクセスのフィルタ処理

コールバックとイベント ハンドラは、イベントを送信できるロールを指定することによって保護できます。ロールは、@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 種類存在するとします。

  1. testuser1 : ロールなし (匿名ロール)
  2. 顧客 : 顧客ロールのみ
  3. マネージャ : 顧客ロールとマネージャ ロールの両方

次の図に、このシナリオに含まれる 3 つのクラス (ニュース リーダー クライアント、中間コントロール、ニュース プロバイダ Web サービス) を示します。通常のメソッドは右矢印で示され、コールバックおよびイベント メソッド/イベント ハンドラは左矢印で示されています。

ニュース配信 Web サービス : SecureNewsService.java

ニュース配信サービス 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;
    }

}

Web サービス コントロール : NewsServiceControl.java

コントロールのイベント セット メソッドには、「@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

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 アノテーションだけがセキュリティを有効にします。 つまり、これらのアノテーションはコントロールのイベント セット メソッドには適用できません。

関連トピック

サンプル : セキュア ニュース サービス

 

ナビゲーション バーのスキップ   ページの先頭