例 3 : 代行認証
この例では、ターミナルに対して代行認証を構成し、テストします。この例では、Caché に以下のコード・ファイルをインストールする必要があります。
-
CreateDelegatedUser.cls — ユーザを作成するための Zen ページ。これは、MYUSERS というグローバルにユーザ名とパスワードを保存しています。クラス定義は Zen_Authenticate.xml に入っています。これには、このチュートリアルの他の例で使用される Zen コードが含まれます。
-
ZAUTHENTICATE.mac — Caché へのアクセスを試行したときにユーザが入力したユーザ名とパスワードを、MYUSERS グローバルで確認する代行認証ルーチン。このルーチンは ZAuth.xml に保存されています。
ZAUTHENTICATE ルーチンは以下のとおりです。
ZAUTHENTICATE(ServiceName,Username,Password,Properties) PUBLIC {
#include %occErrors
set $ZTrap="Error"
set Name=$ZConvert(Username,"U")
set Name=$piece(Username,"@",1)
set UserRecord=$get(^MYUSERS(Name))
if (UserRecord="")
{
quit $SYSTEM.Status.Error($$$UserDoesNotExist,Username)
}
if ($SYSTEM.Encryption.SHA1Hash(Password)'= $List(UserRecord,1))
{
quit $SYSTEM.Status.Error($$$UserInvalidPassword)
}
set Properties("FullName")=$piece(UserRecord,",",2)
set Properties("Comment")=""
set Properties("Roles")="%All"
set Properties("NameSpace")=""
set Properties("Routine")=""
set Properties("Password")=Password
set Properties("Username")=Name
quit $SYSTEM.Status.OK()
Error
set $ZTrap=""
quit $SYSTEM.Status.Error(5002 /*$$$CacheError*/,$ZError)
}
このコードは、以下のように動作します。
-
MYUSERS でユーザにより入力されたユーザ名を検索します。
-
入力されたユーザ名が MYUSERS に含まれていた場合、このユーザの情報を取得し、続行します。含まれていなかった場合は、エラーを表示して終了します。
-
MYUSERS に保存されているパスワードの値と、ユーザにより入力されたパスワードを比較します。ただし、このパスワードは保存前にハッシュされています。値が一致した場合、ルーチンは続行します。不一致の場合は、エラーを表示して終了します。
-
有効なユーザについて、そのユーザ情報を Properties 配列に保存します。Caché は、この配列から情報を取得します。この情報は管理ポータルで表示することができます。
Zen_Authenticate.xml および ZAuth.xml は両方とも install-dir\Dev\tutorials\security に保存されています。