Click here to view and discuss this page in DocCommentXchange. In the future, you will be sent there automatically.

SQL Anywhere 11.0.1 (日本語) » Mobile Link - サーバ管理 » Mobile Link イベント » 同期イベント

 

authenticate_user 接続イベント

カスタム・ユーザ認証を実装します。

パラメータ

次の表の説明では、SQL データ型を示します。Java または .NET でスクリプトを作成する場合、適切なデータ型を使用してください。SQL データ型と Java データ型SQL データ型と .NET データ型を参照してください。

SQL スクリプトでは、名前または疑問符を使用してイベント・パラメータを指定できますが、スクリプト内に名前と疑問符を混在させることはできません。疑問符を使用する場合、パラメータは以下に示す順に指定する必要があり、後続のパラメータが指定されていない場合のみ省略可能です (たとえば、パラメータ 2 を使用する場合は、パラメータ 1 を使用してください)。名前付きパラメータを使用する場合は、パラメータの任意のサブセットを任意の順に指定できます。

SQL スクリプトのパラメータ名 説明 順序
s.authentication_status INTEGER。これは INOUT パラメータです。 1
s.remote_id VARCHAR(128)。Mobile Link リモート ID。名前付きパラメータを使用している場合のみ、リモート ID を参照できます。 適用不可
s.username VARCHAR(128)。Mobile Link ユーザ名。 2
s.password VARCHAR(128)。認証に使用するパスワード。ユーザがパスワードを入力しない場合、この値は NULL です。 3
s.new_password VARCHAR(128)。ユーザ・パスワードをリセットするために使用している場合は、新しいパスワード。ユーザがパスワードを変更しない場合、この値は NULL です。 4
デフォルトのアクション

Mobile Link 組み込みユーザ認証メカニズムを使用します。

備考

Mobile Link 同期サーバは、各同期の開始時にこのイベントを実行します。このイベントは、begin_synchronization トランザクションの前にトランザクション内で実行されます。

このイベントを使用して、組み込み Mobile Link 認証メカニズムを、カスタム・メカニズムに置き換えられます。使用している DBMS の認証メカニズムを使用したり、Mobile Link 組み込みメカニズムには存在しない機能 (パスワードの有効期限やパスワードの最小長など) を実装したりできます。

authenticate_user イベントで使用するパラメータは、次のとおりです。

  • authentication_status   authentication_status パラメータは必須です。認証の全体の成功状況を示します。次のいずれかの値に設定されます。

    戻り値 authentication_status 説明
    V <= 1999 1000 認証に成功しました。
    1999 < V <= 2999 2000 認証に成功しました。パスワードの有効期限がもうすぐ切れます。
    2999 < V <= 3999 3000 認証に失敗しました。パスワードの有効期限が切れています。
    3999 < V <= 4999 4000 認証に失敗しました。
    4999 < V <= 5999 5000 認証に失敗しました。ユーザがすでに同期中です。
    5999 < V 4000 戻り値が 5999 より大きい場合、その値は 4000 として解釈されます。

  • username   Mobile Link ユーザ名を示す省略可能なパラメータです。

    スクリプトでのリモート ID と Mobile Link ユーザ名の使用を参照してください。

  • remote_id   Mobile Link リモート ID。名前付きパラメータを使用している場合のみ、リモート ID を参照できます。

  • password   認証に使用するパスワードを示す省略可能なパラメータです。ユーザがパスワードを入力しない場合、この値は NULL です。

  • new_password   新しいパスワードを示す省略可能なパラメータです。ユーザがパスワードを変更しない場合、この値は NULL です。

authenticate_user イベント用の SQL スクリプトは、ストアド・プロシージャとして実装してください。

2 つの認証スクリプトを両方とも定義し、両方のスクリプトが異なる authentication_status コードを返す場合は、大きい方の値が使用されます。

authenticate_user スクリプトは、すべての認証スクリプトとともに、トランザクション内で実行されます。このトランザクションは、常にコミットを実行します。

LDAP サーバ、IMAP サーバ、POP3 サーバを使用する認証を簡素化するために、authenticate_user イベントに使用できる事前に定義されたスクリプトがあります。

外部サーバに対する認証を参照してください。

参照
SQL の例

一般的な authenticate_user スクリプトは、ストアド・プロシージャの呼び出しです。呼び出しの中のパラメータ順は、上記の順序と同じでなければなりません。次の例では、ml_add_connection_script を使用して、my_auth というストアド・プロシージャにイベントを割り当てます。

CALL ml_add_connection_script(
   'ver1', 'authenticate_user', 'call my_auth ( {ml s.username} )'
)

たとえば、次の SQL Anywhere ストアド・プロシージャは認証にユーザ名のみ使用し、パスワードのチェックは行いません。このプロシージャは、指定されたユーザ名が ULEmployee テーブルにある従業員 ID の 1 つであるかどうかだけを確認します。

CREATE PROCEDURE my_auth( in @user_name varchar(128) )
BEGIN
  IF EXISTS
  ( SELECT * FROM ulemployee
    WHERE emp_id = @user_name )
  THEN
    MESSAGE 'OK' type info to client;
    RETURN 1000;
  ELSE
    MESSAGE 'Not OK' type info to client;
    RETURN 4000;
  END IF
END
Java の例

次の Mobile Link システム・プロシージャ・コールは、スクリプト・バージョン ver1 を同期するときに、authenticateUser という Java メソッドを authenticate_user イベント用のスクリプトとして登録します。これは SQL Anywhere 統合データベース用の構文です。

CALL ml_add_java_connection_script(
   'ver1', 'authenticate_user',
   'ExamplePackage.ExampleClass.authenticateUser'
)

次に示すのは、サンプルの Java メソッド authenticateUser です。このメソッドは、ユーザのパスワードをチェックし、必要に応じてパスワードを変更する Java メソッドを呼び出します。

public String authenticateUser( 
  ianywhere.ml.script.InOutInteger authStatus,
  String user, 
  String pwd, 
  String newPwd )
  throws java.sql.sqlException {
  // A real authenticate_user handler would
  // handle more authentication code states.
  _curUser = user;
  if( checkPwd( user, pwd ) ) {  
    // Authentication successful.
    if( newPwd != null ) {  
      // Password is being changed.
      if( changePwd( user, pwd, newPwd ) ) {  
        // Authentication OK and password change OK.
        // Use custom code.
        authStatus.setValue( 1001 );
      } else {  
        // Authentication OK but password
        // change failed. Use custom code.
        java.lang.System.err.println( "user: "
         + user + " pwd change failed!" );
        authStatus.setValue( 1002 ); 
      } 
    } else {  
      authStatus.setValue( 1000 ); 
    } 
  } else {  
    // Authentication failed.
    authStatus.setValue( 4000 ); 
  }
  return ( null );
}
.NET の例

次の Mobile Link システム・プロシージャ・コールは、スクリプト・バージョン ver1 を同期するときに、AuthUser という .NET メソッドを authenticate_user 接続イベント用のスクリプトとして登録します。これは SQL Anywhere 統合データベース用の構文です。

CALL ml_add_dnet_connection_script(
   'ver1', 'authenticate_user',
   'TestScripts.Test.AuthUser'
)

次に示すのは、サンプルの .NET メソッド AuthUser です。このメソッドは、ユーザのパスワードをチェックし、必要に応じてパスワードを変更する .NET メソッドを呼び出します。

public string AuthUser( 
  ref int authStatus, 
  string user, 
  string pwd, 
  string newPwd ) {
  // A real authenticate_user handler would
  // handle more authentication code states.
  _curUser = user;
  if( CheckPwd( user, pwd ) ) {  
    // Authentication successful.
    if( newPwd != null ) {  
      // Password is being changed.
      if( ChangePwd( user, pwd, newPwd ) ) {  
        // Authentication OK and password change OK.
        // Use custom code.
        authStatus = 1001;
      } else {  
        // Authentication OK but password
        // change failed. Use custom code.
        System.Console.WriteLine( "user: "
         + user + " pwd change failed!" );
        authStatus = 1002; 
      } 
    } else {  
      authStatus = 1000 ; 
    } 
  } else {  
    // Authentication failed.
    authStatus = 4000; 
  }
  return ( null );
}

.NET において C# で作成された authenticate_user スクリプトの詳しい例については、.NET 同期のサンプルを参照してください。