ユーザ用ツール

サイト用ツール


catalyst:auth

Authentication and Authorization

Catalystで認証と認可の処理を行う。ユーザ情報はLDAP、データベース、.htpasswd等に格納できる。ここではハローワールド作成でDBICをモデルとして使ったので認証にもDBICを利用する方法を記述する。LDAP認証を後で試すかも。

セッション管理

以下のプラグインをインストール

${APP_ROOT}/lib/Hoge.pmを修正してプラグインを読み込む。

use Catalyst qw/
  ...
  Session
  Session::Store::FastMmap
  Session::State::Cookie
  ...
/;

認証、認可の処理

以下のプラグインをインストール

ユーザテーブルの作成

CREATE TABLE users
(
    id INTEGER NOT NULL AUTO_INCREMENT,
    username VARCHAR(255) NOT NULL,
    ROLE VARCHAR(255) NOT NULL,
    password VARCHAR(255),
    PRIMARY KEY (id),
    UNIQUE (username)
) CHARACTER SET utf8 TYPE=innoDB;

yamlに設定を記述

authentication:
        default_realm: 'members'
        realms:
                members:
                        credential:
                                class: 'Password'
                                password_field: 'password'
                                password_type: 'clear'
                        store:
                                class: 'DBIx::Class'
                                user_class: 'DBIC::Users'
                                id_field: 'username'
                                role_column: 'role'

${APP_ROOT}/lib/Hoge.pmを修正してプラグインを読み込む。

use Catalyst qw/
  ...
  Authentication
  Authorization::Roles
  ...
/;

ログイン処理コードの例

sub index : Private {
    my ( $self, $c ) = @_;
    if ($c->user_exists) {
        $c->req->action(undef);
        $c->res->redirect($c->uri_for("/admin/index"));
 
    } else {
        $c->stash->{message} = 'ログインしてください';
        $c->stash->{template} = 'auth/index.tt';
    }
}
 
sub login : Local {
    my ($self, $c) = @_;
    # 生パスワードを保存するのはキケンなので止めましょう
    $c->authenticate({
        username => $c->req->param("username"),
        password => $c->req->param("password")
    });
 
    if ($c->user_exists) {
        $c->req->action(undef);
        $c->res->redirect($c->uri_for("/admin/index"));
    } else {
        $c->stash->{message} = 'ユーザ名、またはパスワードが違います';
        $c->stash->{template} = 'auth/index.tt';
    }
}
 
sub logout : Local {
    my ($self, $c)  = @_;
    $c->logout;
    $c->stash->{message} = 'ログアウトしました';
    $c->stash->{template} = 'auth/index.tt';
}
 
sub end : Private {
    my ($self, $c)  = @_;
    $c->forward($c->view('TT')) unless ($c->response->body or $c->response->redirect);
}

ログインが必要なコントローラのbeginに以下の記述を追加

sub begin : Private {
    my ($self, $c)  = @_;
    unless($c->check_user_roles("hogehoge")) {
        $c->req->action(undef);   # これを書かないと本来のアクションが呼ばれてしまう。
        $c->detach("/auth/");   # ログイン画面に飛ばす 
    }
}
catalyst/auth.txt · 最終更新: 2007/11/19 01:20 by 127.0.0.1