Mojolicious::Plugin::Authenticationの使い方を書いてみる。
Mojoliciousでユーザー認証 - Qiitaと組み合わせればもうちょっといいのができるかな?
必須パラメータの説明
パラメータ | 意味 |
---|---|
autoload_user | hookでbefore_dispatchしてるので場合によってはサイトの反応がよくなるかも? とりあえず1にしておけば良い。 |
validate_user | authenticate()が呼ばれた場合に認証処理を行うコールバック関数を記述する。uidを返すこと。 |
load_user | current_user()が呼ばれた場合にユーザーオブジェクトを返すコールバック関数を記述する(引数として上記で返したuidが渡される) |
※これ以外にもあるけど、こまけぇこたぁいいんだよ! |
スクリプトサンプル
mysample.pl
use Mojolicious::Lite;
{
package Database;
my %data = (
1 => {
username => "foo",
password => "bar",
nickname => "baz",
},
);
sub auth {
my ($self, $username, $password) = @_;
foreach my $uid (keys %data) {
next unless $data{$uid}{username} eq $username;
last unless $data{$uid}{password} eq $password;
return $uid;
}
return undef;
}
sub userdata {
my ($self, $uid) = @_;
return $data{$uid};
}
}
app->secrets(['test']);
plugin 'authentication', {
autoload_user => 1,
load_user => sub {
my $self = shift;
my $uid = shift;
return Database->userdata($uid);
},
validate_user => sub {
my $self = shift;
my $username = shift || '';
my $password = shift || '';
return Database->auth($username, $password);
},
};
post '/' => sub {
my $self = shift;
my $u = $self->req->param('u');
my $p = $self->req->param('p');
$self->render(text => ($self->authenticate($u, $p)) ? "ok" : "failed");
};
get '/get' => sub {
my $self = shift;
$self->render(text => ($self->is_user_authenticated) ? "ok" : "denied");
};
get '/logout' => sub {
my $self = shift;
$self->logout();
$self->render( text => "logout" );
};
get '/info' => sub {
my $self = shift;
my $info = $self->current_user;
$self->render( text => ($info) ? $info->{nickname} : "not login" );
};
use Test::More;
use Test::Mojo;
my $t = Test::Mojo->new;
$t->post_ok('/' => form => { u => "foo", p => "bar" })->status_is(200)->content_is("ok");
$t->get_ok('/get')->status_is(200)->content_is("ok");
$t->get_ok('/info')->status_is(200)->content_is("baz");
$t->get_ok('/logout')->status_is(200)->content_is("logout");
$t->get_ok('/info')->status_is(200)->content_is("not login");
$t->get_ok('/get')->status_is(200)->content_is("denied");
done_testing;