アクセス制御
Webサイトにおけるアクセス制御は2通りの方法が考えられます。接続元のホスト(IPアドレス)による制御とユーザ認証による制御です。ホスト制御は TreeFrog には実装されていないので、Webサーバ(Apache/nginx)をプロキシサーバに置くなどして必要に応じて設定してください。
以下ではユーザによる制御について述べます。
ユーザアクセス制御
Webサイトの中には、誰でもアクセスできるページと決まったユーザだけがアクセスできるページがあります。管理用ページはその権限を持つ者しかアクセスできないものです。このようなケースで、次のような方法でアクセスを拒否することができます。
まず、認証の章を参考にして、ユーザモデルクラスを作ります。
アクセスを制限したいページについては、ログイン認証を必須とします。そうすることでユーザモデルのインスタンスが得られることになります。
次に、コントローラの setAccessRules()メソッドをオーバライドして、ユーザIDあるいはグループによるアクションへのアクセス許可/拒否のアクセスルールを設定します。ユーザID、グループはそれぞれユーザモデルクラスの identityKey()メソッド、groupKey()メソッドの戻り値を指しています。
void FooController::setAccessRules()
{
setDenyDefault(true);
QStringList allowed;
allowed << "index" << "show" << "entry" << "create";
setAllowUser("user1", allowed);
:
}
アクセスを許可するには allowUser() や allowGroup() を使い、アクセスを拒否するには denyUser() や denyGroup() を使って定義します。第1引数には、ユーザIDまたはグループを指定します。第2引数には、アクション名またはそのリスト(QStringList)を指定します。
アクセスルールを定義していないユーザからの許可/拒否については、デフォルトの設定が使われます。これは setAllowDefault()メソッドか、 setDenyDefault()メソッドで設定します。
setDenyDefault(true);
次に、アクセスしてきたユーザを検証するロジックです。コントローラのpreFilter()メソッドをオーバライドし、アクセスを拒否するユーザの場合は false を返す。
bool FooController::preFilter()
{
ApplicationController::preFilter();
:
: // ユーザモデルのインスタンスを取得
:
if (!validateAccess(&loginUser)) { // 定義したアクセスルールで検証する
renderErrorResponse(403);
return false;
}
return true;
}
preFilter()メソッドは false を返すと、この後アクションは実行されません。これでアクセスを拒否することになります。
この例では renderErrorResponse()メソッドを使うことで、静的なエラーページ(public/403.html)を表示させています。