perl Mojolicious:2 perl
ひな形生成
第三引数が生成されるプロジェクト名称でPerlの名前空間の先頭大文字である必要があります。
$ mojo generate app LoginTest
ルーティング処理
secretは非推奨となっているのでsecretsを使います。
ブリッジでまずアクセスをフックし、認証状態をチェックします。
未認証状態なら後のコントローラーでindexへ飛ばす処理を書いています。
lib/LoginTest.pm
package LoginTest;
use Mojo::Base Mojolicious ;
sub startup {
my $self = shift;
$self->secrets([ secretword ]);
my $r = $self->routes;
# ブリッジでどこにアクセスするにも認証チェック
$r = $r->bridge->to( root#login );
# / は index に飛ぶようにする
$r->any( / )->to( root#index )->name( index );
# ログアウトはまぁそのまま
$r->get( /logout )->to( root#logout );
}
1;
コントローラー処理
indexがトップページですが、ルーティング処理でまずはloginが呼ばれます。
セッションの確認、もしくは認証パラメータで成功した場合は正を返し、レタリング処理は行いません。それ以外は認証画面を描画します。
lib/LoginTest/Root.pm
package LoginTest::Root;
use Mojo::Base Mojolicious::Controller ;
sub index {
my $self = shift;
$self->render(template => root/index );
}
sub login {
my $self = shift;
my $user = $self->param( user ) || ;
my $pass = $self->param( pass ) || ;
$self->app->log->info( login check );
# セッション確率済みなら認証通過(適当)
if ($self->session( user )) {
return 1;
}
# パスワードチェック(適当)
$self->stash->{auth_failed} = 0;
if ($user || $pass) {
$self->app->log->info( pass check );
if ($user eq test && $pass eq test ) {
$self->session(user => $user);
return 1;
}
$self->stash->{auth_failed} = 1;
}
# 認証画面を描画
$self->render( template => root/auth );
return undef;
}
sub logout {
my $self = shift;
# セッション削除
$self->session(expires => 1);
$self->redirect_to( index );
}
1;
テンプレート
認証画面で入力されたuser passをpostします。postを書かないとURLに?user=xxxx&pass=xxxxのように出てしまいます。
/templates/root/auth.html.ep
% layout default ;
% if ($auth_failed) {
<b> wrong!</b><br>
% }
%= form_for index => (method => post ) => begin
Name:<br>
%= text_field user
<br>Password:<br>
%= text_field pass
%= submit_button Login
% end
認証が通っていればこの画面がようやく表示されます。
logoutをクリックするとセッションが削除されます。
/templates/root/index.ep
% layout default ;
Welcome <%= session user %>.<br>
%= link_to Logout => logout
参考文献(コピペ元)
bridgeを活用する
Mojoliciousのセッションの話 2013年年末版
Mojolicious最新版にしたら、Mojolicious::secretは非推奨というログが。
Mojoliciousですべての処理の前に実行する処理をブリッジで記述する / Mojoliciousリファレンス