フォーム認証のロジックの書き方

フォーム認証のロジックの書き方

フォーム認証を設定した場合、そのゾーンに未認証でアクセスすると設定したログインフォームが表示されます。また、認証をかける時に、そのログイン フォームがPOSTする先はconfirmで設定したページにします。この2 つのページは、そのゾーンの中にありますが、認証のためのものなのでログインしていない状態でもアクセスすることができます。

ここで、ログインすることとは、どういうことかを説明します。Alinous-Coreでは、ログインするということは、セッションの中にログイン情報を生成することを意味します。セッション情報をどのような形式で生成するかは以下のようになります。

認証時の変数

まずは、ログインするためのフォームを作らなくてはなりません。ログインフォームは下図のようなものを作成します。ログインフォームは設定ファイルの<login>タグで指定したページを使います。

認証用のフォーム

ソースは次のようになります。

<FORM name="login" action="confirm.html">

  <SPAN alns:msg="userId" alns:form="login" alns:validate="custom">
    <FONT color="#FF0000">
    Please input correct USER ID and PASSWORD.
    </FONT><BR>
  </SPAN>

  <TABLE>
    <TR>
      <TD>
      USER ID
      </TD>
      <TD>
        <INPUT type="text" name="userId" 
            value="" alns:validate="custom">
      </TD>
    </TR>
    <TR>
      <TD>
      PASSWORD
      </TD>
      <TD>
      <INPUT type="password" name="password" value="">
      </TD>
    </TR>
  </TABLE>
  <INPUT type="submit" value="login">
</FORM>

ここでは、Alinous-Coreのカスタムバリデータを利用しています。alns:validateという属性が最初のINPUTタグについています が、この属性を指定することでカスタムのバリデーションをかけることができます。カスタムのバリデーションが指定された場合、このフォームからPOSTし たときにカスタムのチェック関数が呼ばれ、値が不正だと判断された場合には、再度このフォームに強制的に画面遷移します。このときに、< SPAN>タグの中身のエラーメッセージが表示されます。では、カスタムのバリデーションのロジックはどこにあるのでしょうか? このフォームをPOSTする先の「confirm.html」のロジックに対応する「confirm.alns」を見てみましょう。

// 通常のロジックはここからスタート
// return で0以外を返すとそのページにフォワードされる
return "/admin/";

// バリデーター用のコールバック関数
function validate($formName, $inputName, $value, $IN, $SESSION)
{
  $userId = $IN.userId;
  $pass = $IN.password;
     
     
  SELECT * INTO RECORDS FROM AUTH_TABLE
   WHERE     USERS = $userId AND
         PASSWORDS = $pass;
     
  $NumRoles = Array.size(@RECORDS);
     
  if($NumRoles == 0){
    return "custom";
  }else{
    $SESSION.AUTH.USER = $userId;
    for($i = 0; $i < $NumRoles; $i++){
      $SESSION.AUTH.ROLES[$i] = $RECORDS[$i].ROLES;
    }
  }
     
  return 0;
}

validate()という関数がありますが、カスタムのバリデーションのロジックはこの関数で実装します。この関数では、0を返したときは値が正常で、不正な値の場合は、不正な理由を文字列で返します。この不正な理由は、エラーメッセージを表示するための<SPAN>タグに設定されている alns:validate="custom"の部分と連動しています。バリデーションが正常に行われると、通常通り、「confirm.alns」の先頭からロジックが始まり、次に対応するデザインの「confirm.html」が呼ばれます。今回はreturn文で0以外の値を返しているのでそのページにフォワードされます。