新規ドキュメントはこちら(http://ozaki.kyoichi.jp/content/blogsection/4/26/)に掲載しております。
認証機構(BasicSecurityFilter)を組み込む
mojaviにはFilterという機能があります。このフィルター(Filter)機能をうまく使えば、ページ毎に閲覧に必要な権限を設定することなども容易に行えます。たとえば、ログイン認証が済んでいるかどうかの確認や、ユーザに書き込み権限があるか、ユーザに読み込み権限があるか、などといったチェックをページを表示する前に確認します。また、確認したユーザの状態の結果によって、動作をかえることも簡単にできます。ログインが必要なページへリンク(アクセス)したが、ログイン状態ではない場合はログイン画面に遷移など、ウェブアプリケーションでありがちな機能はmojavi 3に付属している標準のフィルターで実現できます。これらの機能を提供するフィルターはMyProject/mojavi/filter/BasicSecurityFilter.class.phpになります。実際には、MyProject/mojavi配下のファイルは意識しなくてもmojaviアプリケーションは作成できますが、より詳細に内部の仕組みを理解したいという人は一度このソースファイルを覗いてみてください。
さっそく今までに作成してきたサンプルのモジュールHelloWorldに、ログイン認証が必要なように修正します。ここでは、mojavi 3パッケージを展開(インストール)した後に含まれるMyProject/webapp/modules/Defaultも存在している前提で説明を行います。HelloWorldモジュールのconfigディレクトリに移動して、filters.iniというファイルを作成します
[k-ozaki@free15 config]$ cd ~/workspace/MyProject/webapp/modules/HelloWorld/config/
[k-ozaki@free15 config]$ vi filters.ini
filters.inの内容は以下のようにしてください
[BasicSecurityFilter]
class = "BasicSecurityFilter"
param.comment = "On"
これで終わりです。これで、HelloWorldモジュールにアクセスするには、ログイン認証を済ませておく必要があります。mojavi 3においてのログイン認証の確認は、userオブジェクトより、isAuthenticated()で確認できます。認証状態を認証済みにしたい場合は、user->setAuthenticated(TRUE)とします。ここで、実際に以前に作成したHelloWorldモジュールのHelloWorldDBアクションにアクセスしてみます
http://localhost/MyProject/index.php?module=HelloWorld&action=HelloWorldDB
mojavi 3のパッケージにあらかじめ用意されているLogin Actionというページ(アクション)が表示されると思います(HelloWorldDBアクションが表示されてしまった場合はどこかが間違っています)。BasicSecurityFilterは、有効になっているモジュールにアクセスしようとした際にユーザの認証状態を確認して、認証が行われていないユーザについては、MO_LOGIN_MODULEモジュールのMO_LOGIN_ACTIONアクションに遷移します(正確にはController->forward)。このモジュールとアクションが、デフォルトの状態では、DefaultモジュールとLoginアクションになります。この動作を変えたい場合は、MyProject/webapp/config/settings.iniのLOGIN_MODULEとLOGIN_ACTIONの設定を変更して、自分の好きな画面に遷移させることが可能です。MO_はついていない事に注意してください。これについては、config handlerの章で説明しますが、特に今は意識する必要はありません。
次に認証状態を、ログイン済みにする処理を実装しなければ行けません。通常は、ログインフォームを用意して、ログインIDとログインパスワードをユーザに入力してもらい、それらを元にデータベースを参照して、ユーザの本人確認を行います。ここでは説明の都合上、単にログインアクションにアクセスすると、認証状態が済みになるように設定してみます。ではDefaultモジュールのLoginアクションを修正します。MyProject/webapp/modules/Default/action/LoginAction.class.phpを開き、以下のように編集します(今回はexcute()メソッドだけ修正)
<?php
...
public function execute ()
{
$context =& $this->getContext();
$controller =& $context->getController();
$user =& $context->getUser();
$user->setAuthenticated(TRUE);
$moduleName = $controller->getActionStack()->getFirstEntry()->getModuleName();
$actionName = $controller->getActionStack()->getFirstEntry()->getActionName();
$controller->forward($moduleName, $actionName);
}
...
?>
再度、HelloWorldモジュールのHelloWorldDBアクションにアクセスしてみます
http://localhost/MyProject/index.php?module=HelloWorld&action=HelloWorldDBHelloWorldDBにアクセスすることが確認できれば、設定完了です 。今回は、認証の有無だけの設定・確認方法を説明しましたが、権限(Credentials)設定を行えば、権限レベル分けしたアクセス制限も可能になります(例:読み込みのみ、書き込みのみ、管理画面、など)