Alinous-Coreに設定をしてみる
Alinous-Coreおける認証機能は、「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>
タグの中に設定します。
datastore | どのデータベースを使うか |
table | どのテーブルを使うか |
users | ユーザーIDを格納するためのカラム |
passwords | パスワードを格納するためのカラム |
roles | ロールを格納するためのカラム |
ゾーンの設定
ゾーンの設定は<zones>
タグの中で行います。
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では、ログインするということは、セッションの中にログイン情報を生成することを意味します。セッション情報をどのような形式で生成するかは以下のようになります。
まずは、ログインするためのフォームを作らなくてはなりません。ログインフォームは下図のようなものを作成します。ログインフォームは設定ファイルの<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以外の値を返しているのでそのページにフォワードされます。
フォーム認証のログオフ
ログオフの作業はごく簡単です、ログオフするには、ログインの時にセッションに焼き付けたユーザー情報をシステム関数Valuable.release($VAL)
で開放します。
Valuable.release($SESSION.AUTH); return 0;
まとめ
今回は、Alinous-Coreの認証フレームワークについて説明をしました。このコードは、Alinous-Coreのサンプルプロジェクトの中にあるコードなので、サンプルプロジェクトを実際に動かしてみることで、Alinous-CoreのHTMLページの部品化機能との連動仕方や細かいところの動きまで分かっていただけるのではないかと思います。