实现自定义用户鉴定机制。
在下表中,[说明] 部分提供 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 代码,则会使用其中较大的值。
典型的 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
下面的存储过程调用在同步脚本版本 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 ); }下面的存储过程调用在同步脚本版本 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 )
SQL Anywhere Studio 9.0.2
版权所有 © 1989–2005 Sybase, Inc. 部分版权所有 © 2001–2005 iAnywhere Solutions, Inc. 保留所有权利。