カスタムユーザ認証メカニズムを実装します。
次の表の説明では、SQL データ型を示します。Java または .NET でスクリプトを作成する場合、適切な対応するデータ型を使用します。 SQL データ型と Java データ型とSQL データ型と .NET データ型を参照してください。
SQL スクリプトでは、名前または疑問符を使用してイベントパラメータを指定できます。疑問符の使用は推奨されなくなりました。名前付きパラメータを使用することをおすすめします。1 つのスクリプト内で名前と疑問符を混在させることはできません。疑問符を使用する場合、パラメータは以下に示す順に指定する必要があり、後続のパラメータが指定されていない場合のみ省略可能です (たとえば、パラメータ 2 を使用する場合は、パラメータ 1 を使用してください)。名前付きパラメータを使用する場合は、パラメータの任意のサブセットを任意の順に指定できます。
SQL スクリプトのパラメータ名 | 説明 | 順序 (SQL では非推奨) |
---|---|---|
s.authentication_status | INTEGER。これは INOUT パラメータです。 | 1 |
s.authentication_message | VARCHAR(1024)。これは INOUT パラメータです。認証メッセージを提供します。 | 適用外 |
s.remote_id | VARCHAR(128)。Mobile Link リモート ID。名前付きパラメータを使用している場合のみ、リモート ID を参照できます。 | 適用外 |
s.username | VARCHAR(128)。Mobile Link ユーザ名。 | 2 |
s.hashed_password | BINARY(32)。ユーザがパスワードを入力しない場合、この値は NULL です。 | 3 |
s.hashed_new_password | BINARY(32)。ユーザのパスワードを変更するためにこのイベントを使用していない場合、この値は NULL です。 | 4 |
s.script_version | VARCHAR(128)。Mobile Link サーバが現在の同期に使用しているスクリプトバージョン文字列をこのパラメータに渡すことを指定する、オプションの IN パラメータ。このパラメータの指定に疑問符を使用することはできません。 | 適用外 |
Mobile Link 組み込みユーザ認証メカニズムを使用します。
このイベントは authenticate_user と同じですが、パスワードの部分のみ異なります。パスワードは、ml_user.hashed_password カラムに格納されたものと同じように、ハッシュされた形式となります。パスワードをハッシュされた形式で渡すことにより、セキュリティが向上します。
一方向ハッシュが使用されます。一方向ハッシュはパスワードを使用し、それを各パスワードで (基本的に) ユニークなバイトシーケンスに変換します。一方向ハッシュでは、統合データベースに実際のパスワードを保存せずにパスワードの認証を行えます。
Mobile Link のバージョンごとにハッシュの質が徐々に向上しており、このスクリプトはユーザの認証シーケンス中に複数回呼び出すことができます。
authenticate_user と authenticate_user_hashed を両方とも定義し、両方のスクリプトが異なる authentication_status コードを返す場合は、大きい方の値が使用されます。
一般的な authenticate_user_hashed スクリプトは、ストアドプロシージャの呼び出しです。呼び出しの中のパラメータ順は、上記の順序と同じでなければなりません。次の例では、ml_add_connection_script を呼び出して、my_auth というストアドプロシージャにイベントを割り当てます。
CALL ml_add_connection_script( 'ver1', 'authenticate_user_hashed', 'call my_auth ( {ml s.authentication_status}, {ml s.username}, {ml s.hashed_password})' ) |
次の SQL Anywhere のストアドプロシージャは、認証にユーザ名とパスワードの両方を使用します。このプロシージャは、指定されたユーザ名が ULEmployee テーブルにある従業員 ID の 1 つであるかどうかだけを確認します。プロシージャは、Employee テーブルには hashed_pwd という名前の binary(20) のカラムがあることを前提としています。
CREATE PROCEDURE my_auth( inout @authentication_status integer, in @user_name varchar(128), in @hpwd binary(32) ) BEGIN IF EXISTS ( SELECT * FROM ulemployee WHERE emp_id = @user_name and hashed_pwd = @hpwd ) 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 を同期するときに、authUserHashed という Java メソッドを authenticate_user_hashed イベント用のスクリプトとして登録します。
CALL ml_add_java_connection_script( 'ver1', 'authenticate_user_hashed', 'ExamplePackage.ExampleClass.authUserHashed') |
次に示すのは、サンプルの Java メソッド authUserHashed です。このメソッドは、ユーザのパスワードをチェックし、必要に応じてパスワードを変更する Java メソッドを呼び出します。
public void authUserHashed( ianywhere.ml.script.InOutInteger authStatus, String user, byte pwd[], byte newPwd[] ) throws java.sql.SQLException { // A real authenticate_user_hashed handler // would handle more auth code states. _curUser = user; if( checkPwdHashed( user, pwd ) ) { // Authorization successful. if( newPwd != null ) { // Password is being changed. if( changePwdHashed( user, pwd, newPwd ) ) { // Authorization OK and password change OK. // Use custom code. authStatus.setValue( 1001 ); } else { // Auth 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 { // Authorization failed. authStatus.setValue( 4000 ); } } |
次の Mobile Link システムプロシージャコールは、スクリプトバージョン ver1 を同期するときに、AuthUserHashed という .NET メソッドを authenticate_user_hashed 接続イベント用のスクリプトとして登録します。これは SQL Anywhere 統合データベース用の構文です。
CALL ml_add_dnet_connection_script( 'ver1', 'authenticate_user_hashed', 'TestScripts.Test.AuthUserHashed' ) |
次に示すのは、サンプルの .NET メソッド AuthUserHashed です。
namespace TestScripts { public class Test { string _curUser = null; public void AuthUserHashed( ref int authStatus, string user, byte[] pwdHash, byte[] newPwdHash ) { // A real authenticate_user_hashed handler // would handle more auth code states. _curUser = user; if( CheckPwdHashed( user, pwdHash ) ) { // Authorization successful. if( newPwdHash != null ) { // Password is being changed. if( ChangePwdHashed( user, pwdHash, newPwdHash ) ) { // Authorization OK and password change OK. // Use custom code. authStatus = 1001; } else { // Auth OK but password change failed. // Use custom code System.Console.WriteLine( "user: " + user + " pwd change failed!" ); authStatus = 1002; } } else { authStatus = 1000; } } else { // Authorization failed. authStatus = 4000; } }}} |
![]() |
DocCommentXchange で意見交換できます
|
Copyright © 2013, SAP AG or an SAP affiliate company. - SAP Sybase SQL Anywhere 16.0 |