Collection Contents 上一页 下一页 PDF

MobiLink 管理指南

同步事件

authenticate_user 连接事件


功能 

实现自定义用户鉴定。

参数 

在下表中,[说明] 部分列出 SQL 数据类型。如果您使用 Java 或 .NET 编写脚本,则应该使用相应的数据类型。请参见 SQL-Java 数据类型SQL-.NET 数据类型

只有当未指定任何后续参数时,事件参数才是可选的。例如,如果要使用参数 2,您必须使用参数 1。

参数 说明
1 auth_status INTEGER。这是一个 INOUT 参数。
2 ml_username VARCHAR(128)。
3 user_password VARCHAR(128)。
4 user_new_password VARCHAR(128)。
缺省操作 

使用 MobiLink 内置用户鉴定机制。

说明 

MobiLink 同步服务器在每个同步开始时执行该事件。该事件在 begin_synchronization 事务之前的事务中执行。

您可以使用该事件并用自定义机制代替内置的 MobiLink 鉴定机制。您可能希望调用 DBMS 的鉴定机制,或者实现 MobiLink 的内置机制中没有的功能,如口令失效日期或最小口令长度等。

authenticate_user 事件使用如下参数:

  1. auth_status    这个必需的参数是一个 INOUT 参数:INOUT 参数可以向脚本提供值,并且可以接受脚本赋予的新值。auth_status 参数指示鉴定是否成功,可设置为以下值:

    返回值 Auth_status 说明
    V <= 1999 1000 鉴定成功。
    1999 < V <= 2999 2000 鉴定成功:口令即将失效。
    2999 < V <= 3999 3000 鉴定失败:口令已失效。
    3999 < V <= 4999 4000 鉴定失败。
    4999 < V <= 5999 5000 鉴定失败,用户已经在进行同步
    5999 < V 4000 如果返回值大于 5999,则 MobiLink 将其解释为返回值 4000。
  2. ml_username    此可选参数为 MobiLink 用户名。

  3. user_password    可选参数,指示用于进行鉴定的口令。如果用户不提供口令,则为 NULL。

  4. user_new_password    可选参数,指示新口令。如果用户不更改他们的口令,则为 NULL。

authenticate_user 事件的 SQL 脚本必须作为存储过程实现。

如果定义了两个鉴定脚本,并且两个脚本返回不同的 auth_status 代码,则会使用其中较大的值。

authenticate_user 脚本是在一个事务中与所有鉴定脚本一起执行的。总是提交该事务。

可为 authenticate_user 事件使用一些预定义的脚本,以简化使用 LDAP、IMAP 和 POP3 服务器时的鉴定。

有关详细信息,请参见向外部服务器鉴定

另请参见 
SQL 示例 

典型的 authenticate_user 脚本是一个对存储过程的调用。该调用中参数的顺序必须与上面的顺序匹配。下面的示例使用 ml_add_connection_script 将事件指派给名为 my_auth 的存储过程。

call ml_add_connection_script(
   'ver1', 'authenticate_user', 'call my_auth ( ?, ?, ?, ? )'
)

下面的 Adaptive Server Anywhere 存储过程只使用用户名进行鉴定,不进行口令检查。该过程只检查所提供的用户名是否为 ULEmployee 表中列出的一个员工 ID。

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 示例 

下面的存储过程调用在同步脚本版本 ver1 时将名为 authenticateUser 的 Java 方法注册为 authenticate_user 事件的脚本。此语法用于 Adaptive Server 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
{  // in a real authenticate_user handler, we would
   // handle more auth code states
   _curUser = user;
   if( checkPwd( user, pwd ) )
   {  // auth successful
      if( newPwd != null )
      {  // pwd is being changed
         if( changePwd( user, pwd, newPwd ) )
         {  // auth ok and pwd change ok. Use custom code
            authStatus.setValue( 1001 ); 
         }
         else {  // authorization 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 {  // auth failed
           authStatus.setValue( 4000 ); }
   return( null ); }
.NET 示例 

下面的存储过程调用在同步脚本版本 ver1 时将名为 AuthUser 的 .NET 方法注册为 authenticate_user 连接事件的脚本。此语法用于 Adaptive Server Anywhere 统一数据库。

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

下面是方法 AuthUser 的 C# 签名。

public void AuthUser( ref int authStatus, string user, string pwd, string newPwd )

有关使用 .NET 中 C# 编写的 authenticate_user 脚本示例的更多详细信息,请参见 .NET 同步示例


Collection Contents 上一页 下一页 PDF