Angepasste Benutzerauthentifizierung implementieren.
In der folgenden Tabelle gibt die Beschreibung den SQL-Datentyp an. Wenn Sie Ihr Skript in Java oder .NET schreiben, müssen Sie den entsprechenden Datentyp benutzen. Siehe SQL-Java-Datentypen und SQL-.NET-Datentypen.
In SQL-Skripten können Sie Ereignisparameter mit ihrem Namen oder mit einem Fragezeichen angeben. Die Verwendung von Fragezeichen ist veraltet und es wird empfohlen, benannte Parameter zu verwenden. Sie können nicht Namen und Fragezeichen in einem Skript mischen. Wenn Sie Fragezeichen verwenden, müssen die Parameter in der nachfolgend gezeigten Reihenfolge stehen und sind nur dann optional, wenn keine nachfolgenden Parameter angegeben wurden (z.B. müssen Sie Parameter 1 verwenden, wenn Sie Parameter 2 verwenden möchten). Wenn Sie benannte Parameter verwenden, können Sie beliebige Teilmengen der Parameter in beliebiger Reihenfolge angeben.
Parametername für SQL-Skripten | Beschreibung | Reihenfolge (veraltet für SQL) |
---|---|---|
s.authentication_status | INTEGER. Dies ist ein INOUT-Parameter. | 1 |
s.remote_id | VARCHAR(128). Die entfernte ID von MobiLink. Sie können die entfernte ID nur dann referenzieren, wenn Sie benannte Parameter verwenden. | Nicht anwendbar |
s.username | VARCHAR(128). Der MobiLink-Benutzername. | 2 |
s.password | VARCHAR(128). Das Kennwort für Authentifizierungszwecke. Wenn der Benutzer kein Kennwort eingibt, ist sein Wert NULL. | 3 |
s.new_password | VARCHAR(128). Das neue Kennwort, sofern es zum Zurücksetzen des Kennworts verwendet wird. Wenn der Benutzer sein Kennwort nicht ändert, ist dieser Wert NULL. | 4 |
s.new_remote_id | VARCHAR(128). Die entfernte MobiLink-ID, wenn die entfernte ID in der konsolidierten Datenbank neu ist. Wenn die entfernte ID nicht neu ist, ist der Wert NULL. | |
s.new_username | VARCHAR(128). Der MobiLink-Benutzername, wenn der Benutzername in der konsolidierten Datenbank neu ist. Wenn der Benutzername nicht neu ist, ist der Wert NULL. |
Integriertes MobiLink-Benutzerauthenifizierungverfahren verwenden.
Der MobiLink-Server führt dieses Ereignis beim Start jeder einzelnen Synchronisation aus. Es wird in einer Transaktion vor der Transaktion begin_synchronization ausgeführt.
Sie können dieses Ereignis verwenden, um das integrierte MobiLink-Authentifizierungsverfahren durch ein angepasstes Verfahren zu ersetzen. Als Grund dafür ist denkbar, dass Sie möglicherweise das Authentifizierungsverfahren Ihres DBMS verwenden oder Funktionen implementieren wollen, die im integrierten MobiLink-Verfahren nicht vorhanden sind, z.B. ein Kennwortablaufdatum oder eine Mindestlänge für das Kennwort.
Im Ereignis authenticate_user werden folgende Parameter verwendet:
authentication_status Der Parameter authentication_status ist erforderlich. Zeigt den gesamten Erfolg der Authentifizierung an und kann einen der folgenden Werte annehmen:
Zurückgegebener Wert | authentication_status | Beschreibung |
---|---|---|
V <= 1999 | 1000 | Authentifizierung erfolgreich |
2000 <= V <= 2999 | 2000 | Authentifizierung erfolgreich, aber das Kennwort läuft in Kürze ab. |
3000 <= V <= 3999 | 3000 | Authentifizierung fehlgeschlagen: Kennwort abgelaufen. |
4000 <= V <= 4999 | 4000 | Authentifizierung fehlgeschlagen. |
5000 <= V <= 5999 | 5000 | Authentifizierung nicht möglich, da die entfernte ID bereits verwendet wird. Versuchen Sie die Synchronisation später nochmals. |
6000 <= V | 4000 | Wenn der zurückgegebene Wert größer als 5999 ist, interpretiert ihn MobiLink als einen Rückgabewert von 4000. |
Der Wert wird an den Client gesendet und kann daher verwendet werden, um das Authentifizierungsverhalten auf Clientseite anzupassen.
Siehe:
username Dieser optionale Parameter ist der MobiLink-Benutzername.
remote_id Die entfernte ID von MobiLink. Sie können die entfernte ID nur dann referenzieren, wenn Sie benannte Parameter verwenden.
password Dieser optionale Parameter zeigt das Kennwort für Authentifizierungszwecke an. Wenn der Benutzer kein Kennwort eingibt, ist dies NULL.
new_password Dieser optionale Parameter gibt ein neues Kennwort an. Wenn der Benutzer sein Kennwort nicht ändert, ist dieser Parameter NULL.
new_remote_id Dieser optionale Parameter gibt eine neue entfernte ID an. Wenn die entfernte ID nicht neu ist, ist dies NULL.
new_username Dieser optionale Parameter gibt einen neuen Benutzernamen an. Wenn der Benutzername nicht neu ist, ist dies NULL.
SQL-Skripten für das Ereignis authenticate_user müssen als gespeicherte Prozedur implementiert werden.
Wenn die beiden Authentifizierungsskripten definiert sind und beide Skripten unterschiedliche authentication_status-Codes zurückgeben, wird der höhere verwendet.
Das Skript authenticate_user wird in einer Transaktion zusammen mit allen Authentifikationskripten ausgeführt. Diese Transaktion schreibt immer fest.
Es gibt vordefinierte Skripten, die Sie für das authenticate_user-Ereignis verwenden können, um die Authentifzierung mit LDAP-, IMAP- und POP3-Servern zu vereinfachen.
Ein typisches authenticate_user-Skript ist ein Aufruf einer gespeicherten Prozedur. Die Reihenfolge der Parameter im Aufruf muss mit der oben angegebenen Reihenfolge übereinstimmen. Das folgende Beispiel weist das Ereignis mithilfe von ml_add_connection_script der gespeicherten Prozedur my_auth zu.
CALL ml_add_connection_script( 'ver1', 'authenticate_user', 'call my_auth ( {ml s.authentication_status}, {ml s.username} )' ) |
Die folgende gespeicherte Prozedur von SQL Anywhere benutzt nur den Benutzernamen für die Authentifizierung. Sie prüft kein Kennwort. Die Prozedur stellt nur sicher, dass der angegebene Benutzername eine der Mitarbeiter-IDs in der Tabelle ULEmployee ist.
CREATE PROCEDURE my_auth( inout @auth_status int, in @user_name varchar(128) ) BEGIN IF EXISTS ( SELECT * FROM ulemployee WHERE emp_id = @user_name ) THEN MESSAGE 'OK' type info to client; SET @auth_status = 1000; ELSE MESSAGE 'Not OK' type info to client; SET @auth_status = 4000; END IF END |
Der folgende Aufruf einer MobiLink-Systemprozedur registriert eine Java-Methode namens authenticateUser als das Skript für das Ereignis authenticate_user, wenn die Skriptversion ver1 synchronisiert wird. Diese Syntax gilt für konsolidierte SQL Anywhere-Datenbanken.
CALL ml_add_java_connection_script( 'ver1', 'authenticate_user', 'ExamplePackage.ExampleClass.authenticateUser' ) |
Im Folgenden sehen Sie die Java-Beispielmethode authenticateUser. Sie ruft Java-Methoden auf, die das Benutzerkennwort prüfen und gegebenenfalls ändern.
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 ); } |
Der folgende Aufruf einer MobiLink-Systemprozedur registriert eine .NET-Methode namens AuthUser als das Skript für das Verbindungsereignis authenticate_user, wenn die Skriptversion ver1 synchronisiert wird. Diese Syntax gilt für konsolidierte SQL Anywhere-Datenbanken.
CALL ml_add_dnet_connection_script( 'ver1', 'authenticate_user', 'TestScripts.Test.AuthUser' ) |
Im Folgenden sehen Sie die .NET-Beispielmethode AuthUser. Sie ruft .NET-Methoden auf, die das Benutzerkennwort prüfen und gegebenenfalls ändern.
namespace TestScripts { public class Test { string _curUser = null; 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 ); }}} |
Ein ausführlicheres Beispiel für ein authenticate_user-Skript in C# in .NET finden Sie unter .NET-Synchronisationsbeispiel.
![]() |
Kommentieren Sie diese Seite in DocCommentXchange.
|
Copyright © 2012, iAnywhere Solutions, Inc. - SQL Anywhere 12.0.1 |