CL

48. System i のユーザー、パスワードの検査

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 でパラメータとして与え、さらに
CCSID65535 として &CCSID としてパラメータを追加している。
実はこれらのパラメータは省略可能であるが OS V5R3M0 では、これらのパラメータを
省略するとエラーとなってしまうというバグがある。
( バグである証拠に V5R4M0 以降 は省略しても正常に動作する。)
従ってすべての OSリリースでも正常に動作するように冗長ではあるが
パラメータを明示的に追加している。