perl 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>
% &#125;

%= 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リファレンス