Collection Contents 上一页 下一页 PDF

MobiLink 管理指南

同步事件

authenticate_user_hashed 连接事件


功能 

实现自定义用户鉴定机制。

参数 

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

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

参数 说明
1 auth_status INTEGER。这是一个 INOUT 参数。
2 ml_username VARCHAR(128)。
3 hashed_user_password BINARY(20)。如果用户不提供口令,则为 NULL。
4 hashed_new_password BINARY(20)。如果用户不更改他们的口令,则为 NULL。
缺省操作 

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

说明 

该事件与 authenticate_user 相同,但是其口令是以散列形式传递的,与存储在 ml_user.hashed_password 列中口令的形式相同。以散列形式传递口令可以增强安全性。

将使用单向散列。单向散列接受口令并将其转换为一个字节序列,该序列(实质上)对每个可能的口令是唯一的。单向散列允许进行口令鉴定,而不必将实际的口令存储于统一数据库中。

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

另请参见 
SQL 示例 

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

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

下面的 Adaptive Server Anywhere 存储过程使用用户名和口令进行鉴定。该过程只检查所提供的用户名是否为 ULEmployee 表中列出的一个员工 ID。该过程假定 Employee 表中有一个名为 hashed_pwd 的 binary(20) 列。

CREATE PROCEDURE my_auth( 
  inout @auth_status integer, 
  in @user_name varchar(128), 
  in @hpwd binary(20) )
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

Java 示例 

下面的存储过程调用在同步脚本版本 ver1 时将名为 authUserHashed 的 Java 方法注册为 authenticate_user_hashed 事件的脚本。

call ml_add_java_connection_script(
   'ver1', 'authenticate_user_hashed',
   'ExamplePackage.ExampleClass.authUserHashed')

下面是示例 Java 方法 authUserHashed。它调用检查用户口令(并在需要时更改用户口令)的 Java 函数。

public String authUserHashed(
   ianywhere.ml.script.InOutInteger authStatus,
   String user, byte pwd[], byte newPwd[] )
  throws java.sql.SQLException
{  // in a real authenticate_user_hashed handler, we
   // would handle more auth code states
   _curUser = user;
   if( checkPwdHashed( user, pwd ) ) {
   // auth successful
     if( newPwd != null )
     {  // pwd is being changed
        if( changePwdHashed( user, pwd, newPwd ) )
        {  // auth ok and pwd change ok use custom code
           authStatus.setValue( 1001 ); }
        else
        { // auth ok but pwd 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 时将名为 AuthUserHashed 的 .NET 方法注册为 authenticate_user_hashed 连接事件的脚本。此语法用于 Adaptive Server Anywhere 统一数据库。

call ml_add_dnet_connection_script(
   'ver1',
   'authenticate_user_hashed',
   'TestScripts.Test.AuthUserHashed'
)

下面是调用 AuthUserHashed 的 C# 签名。

public void AuthUserHashed(
   ref int authStatus,
   string user,
   byte[] pwd,
   byte[] newPwd )

Collection Contents 上一页 下一页 PDF