Web開発でユーザー認証を行うときにフォーム認証でログインしたユーザー、パスワードを
登録しておいたユーザー・ファイルを参照して認証するという方法は良く見受けられる。
しかし機密保護の観点からもユーザーとパスワードを物理ファイルに保存するという手法は
機密保護を危うくすることに他ならない。
物理ファイルの中身は権限さえあれば QUERY でも簡単に見れてしまうからである。
幸い System i には非常に堅牢なユーザー、パスワードの機密保護があるのであるから、
これを利用することが最も望ましい。
しかし多くの開発者がユーザー認証を物理ファイルで行っている背景には
System i のユーザー、パスワードの認証の方法に馴染みがないからではないかと予想される。
そこで、ここでは System i に登録済みのユーザー、パスワードを使って認証を行う CLP の例を
下記に紹介する。
0001.00 PGM PARM(&USER &PASS) 0002.00 /*---------------------------------------------------------*/ 0003.00 /* TESTUSR : ユーザー、パスワードの検査 */ 0004.00 /*---------------------------------------------------------*/ 0005.00 DCL VAR(&USER) TYPE(*CHAR) LEN(10) 0006.00 DCL VAR(&PASS) TYPE(*CHAR) LEN(10) 0007.00 DCL VAR(&PRFHND) TYPE(*CHAR) LEN(12) 0008.00 DCL VAR(&MSG) TYPE(*CHAR) LEN(80) 0009.00 DCL VAR(&APIERR) TYPE(*CHAR) LEN(4) + 0010.00 VALUE(X'00000000') /* 2 進数 */ 0011.00 DCL VAR(&LEN) TYPE(*CHAR) LEN(4) 0012.00 DCL VAR(&CCSID) TYPE(*CHAR) LEN(4) 0013.00 MONMSG MSGID(CPF0000) EXEC(GOTO CMDLBL(ERROR)) 0014.00 0015.00 CHGVAR VAR(%BIN(&LEN)) VALUE(10) 0016.00 CHGVAR VAR(%BIN(&CCSID)) VALUE(65535) 0017.00 CALL PGM(QSYGETPH) PARM(&USER &PASS &PRFHND + 0018.00 &APIERR &LEN &CCSID) 0019.00 CALL PGM(QSYRLSPH) PARM(&PRFHND) 0020.00 SNDPGMMSG MSG(' ログイン OK') MSGTYPE(*COMP) 0021.00 RETURN 0022.00 0023.00 ERROR: RCVMSG MSGTYPE(*LAST) RMV(*NO) MSG(&MSG) 0024.00 SNDMSG: SNDPGMMSG MSG(&MSG) MSGTYPE(*DIAG) 0025.00 ENDPGM
【 解説 】
API : QSYGETPH はユーザー、パスワードを使ってログインすると、認証が成功すれば
プロフィール・ハンドルを戻す。
認証が成功すれば API : QSYRLSPH によってハンドルを解放しておくこと。
上記の例では &LEN としてパスワード長を BIN でパラメータとして与え、さらに
CCSID を 65535 として &CCSID としてパラメータを追加している。
実はこれらのパラメータは省略可能であるが OS V5R3M0 では、これらのパラメータを
省略するとエラーとなってしまうというバグがある。
( バグである証拠に V5R4M0 以降 は省略しても正常に動作する。)
従ってすべての OSリリースでも正常に動作するように冗長ではあるが
パラメータを明示的に追加している。