カスタム・ユーザ認証を実装します。
次の表の説明では、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 イベントに使用できる事前に定義されたスクリプトがあります。
外部サーバに対する認証を参照してください。
一般的な 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 |
次の 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 ); } |
次の 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 同期のサンプルを参照してください。
Copyright © 2009, iAnywhere Solutions, Inc. - SQL Anywhere 11.0.1 |