SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

Webフレームワーク「Alinous-Core」でアプリケーション開発をはじめよう

Alinous-Coreの認証FWでBASIC認証とフォーム認証を運用

Web認証の基礎の理解


  • X ポスト
  • このエントリーをはてなブックマークに追加

Alinous-Coreに設定をしてみる

 Alinous-Coreおける認証機能は、「alinous-config.xml」に設定することで動作させることができます。実際には以下のような記述をします。

alinous-config.xml
<?xml version="1.0" encoding="utf-8"?>
<alinous-config>
  <system>
    <system-datastore id="pgsrc" />
    <default-datastore id="pgapps" />
  </system>

  <datasources id="pgsrc" 
class="org.alinous.plugin.postgres.PostgreSQLDataSource">
<connect>jdbc:postgresql://localhost:5432/alinous</connect> <user>postgres</user> <pass>postgres</pass> </datasources> <datasources id="pgapps"
class="org.alinous.plugin.postgres.PostgreSQLDataSource">
<connect>jdbc:postgresql://localhost:5432/alinous</connect> <user>postgres</user> <pass>postgres</pass> </datasources> <basic-auth> <relm> <datastore>pgsrc</datastore> <table>AUTH_TABLE</table> <users>USERS</users> <passwords>PASSWORDS</passwords> <roles>ROLES</roles> </relm> <zones> <zone> <area>/admin/</area> <roles>admin</roles> <form-auth> <login>/admin/login.html</login> <confirm>/admin/confirm.html</confirm> </form-auth> </zone> <zone> <area>/admin/system/</area> <roles>admin,owner</roles> <error-page>/admin/error.html</error-page> </zone> </zones> </basic-auth> </alinous-config>

レルムの設定

 レルムとは、「ユーザーのID」「パスワード」「ロール」を管理するためのデータベースのことです。Alinous-Coreでは、どのテーブルのどのカラムをどのように割り当てるかを設定ファイルで決めることができ、<relm>タグの中に設定します。

XMLの内容
datastore どのデータベースを使うか
table どのテーブルを使うか
users ユーザーIDを格納するためのカラム
passwords パスワードを格納するためのカラム
roles ロールを格納するためのカラム

ゾーンの設定

 ゾーンの設定は<zones>タグの中で行います。

XMLの内容
area 指定したディレクトリ以下がそのゾーンの場所になります
roles どのロールのユーザーを許可するか(コンマ区切りで複数可)
error-page Basic認証失敗時のエラーページ(省略化)
login フォーム認証の際に利用するログインフォームページ(省略化)
confirm ログイン処理の成功時、確認時に利用するページ(省略化)

 サンプルの設定ファイルには、2つのゾーンが設定されています。1つのゾーン「/admin/」はフォーム認証で管理され、もう1つのゾーン「/admin/system/」は、ベーシック認証で管理されます。ゾーンのマッチングは、最長マッチングで処理されます。例を挙げると、「/admin/system/index.html」は、両方のゾーンに含まれますが、最長マッチのルールを適用すると「/admin/system/」のゾーンの方にマッチし、こちらのゾーンの認証ルールが適用されます。

 そのゾーンがBasic認証になるか、フォーム認証になるかは<form-auth>タグに含まれる2つの設定項目、loginとconfirmの有無によって判断されます。Basic認証の場合は、ログアウトがない代わりに、認証は設定ファイルのみで済ませることができます。一方、フォーム認証の場合は認証の処理を自分で書く必要があります。

フォーム認証のログイン

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

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

図1セッションのフォーマット
図1セッションのフォーマット

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

図2ログインのためのフォーム
図2ログインのためのフォーム

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

ログオフ
<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」を見てみましょう。

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以外の値を返しているのでそのページにフォワードされます。

フォーム認証のログオフ

 ログオフの作業はごく簡単です、ログオフするには、ログインの時にセッションに焼き付けたユーザー情報をシステム関数Valuable.release($VAL)で開放します。

ログオフ
Valuable.release($SESSION.AUTH);

return 0;

まとめ

 今回は、Alinous-Coreの認証フレームワークについて説明をしました。このコードは、Alinous-Coreのサンプルプロジェクトの中にあるコードなので、サンプルプロジェクトを実際に動かしてみることで、Alinous-CoreのHTMLページの部品化機能との連動仕方や細かいところの動きまで分かっていただけるのではないかと思います。

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
Webフレームワーク「Alinous-Core」でアプリケーション開発をはじめよう連載記事一覧

もっと読む

この記事の著者

飯塚 友裕(イイヅカ トモヒロ)

Eclipse関連のソースコード自動生成プロダクトの開発者。ソースコード自動生成エンジンを他社に供給する技術エンジン会社「CROSSFIRE JAPAN, INC.」で、O/RマッピングツールやJavaによるSQLパーサーを開発。現在、NetBeans.org(米国)のパートナー。最近は、Alinous-Coreを利用したパッケージビジネスを行っています。SEO対策対応ECサイト構築パッケージOpen-ECAlinous-Coreのソースコードダウンロードhttp://sourceforge.jp/projects/alinous-core/はてなブログhttp://d.hatena.ne.jp/i-zuka/

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/1374 2008/09/03 13:58

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング