ROUTE 3390

備忘録的な用途で書いていますが、どなたかの役に立つ事があれば嬉しいです。

MojoliciousでのSession管理

よくあるセッション管理って、アクセスしてきたユーザー(ブラウザ)にセッションIDを発行します。


サーバー側ではセッションIDをキーにして
色々な(ユーザーAAAで、ログイン済みといった)情報を保存しておきます。


ユーザーのブラウザにはセッションIDが、
サーバー側に色々な情報が保存されるわけです。

ユーザーは発行されるセッションIDしか分かりません。


しかし、Mojoliciousにある標準のセッション管理はまったく逆のようなもので
ユーザー側で(ブラウザに)色々と保存するようになっています。
これは簡単に改ざんが可能でセキュリティ的に良くないです。
Mojolicious::Sessionではsecretを設定する事でHMAC-MD5という暗号化を行い、改ざんによるセキュリティリスクは低くなっているようです。今度ちゃんと勉強しようと思います。


そこでMojoX::Sessionです。
これを使えばよくあるセッション管理が実現できます。
ユーザー側にはセッションIDだけ、
色々な情報はサーバー側に保存するようになるのです。


僕の場合はMongoDBというデータベースを使っているので、
MojoX::Session::Store::MongoDBを使いますが、他のDBでも
だいたい同じです。

use MojoX::Session::Store::MongoDB;
use MojoX::Session::Transport::Cookie;

こんな感じでuseします。

startupメソッドではこんな感じ

$self->plugin('session' => {
    store => MojoX::Session::Store::MongoDB->new(
	{
	    host => '127.0.0.1',
	    port => 27017,
	    database   => 'データベース名',
	    collection => 'テーブル名',
	}
    ),
    transport => MojoX::Session::Transport::Cookie->new,
    expires_delta => 3600,
    stash_key => 'mojox-session',
});

ちなみにMongoDBでcollection(テーブル)に認証が必要な場合は下記のようにする必要がありました。

さっきのに加えてこれもuseします。

use MongoDB::Connection;

そんででもってこう!

my $mongo_obj = MongoDB::Connection->new( host => 127.0.0.1:27017' );
$mongo_obj->authenticate( 'データベース名', 'ユーザー名', 'パスワード' );
$self->plugin('session' => {
    store => MojoX::Session::Store::MongoDB->new(
	{
	    mongodb => $mongo_obj->get_database( 'データベース名' ),
	    collection => 'テーブル名',
	}
    ),
    transport => MojoX::Session::Transport::Cookie->new,
    expires_delta => 3600,
    stash_key => 'mojox-session',
});

MojoX::Session::Store::MongoDBでは認証を受け取る仕組みが用意されていないので、
認証設定済みのMongoDB::Connectionメソッドを渡しているんですね。


expires_delta というのは有効期限です。
デフォルトは3600秒になっていますが、上の例ではあえて設定してあります。
単位は秒で、発行された時間よりこの時間を過ぎると新しいセッションを発行しま
す。

stash_key に指定したキーで、後からセッション情報にアクセス出来ます。

詳しい使い方はこちら

my $session = $self->stash('mojox-session'); #セッションオブジェクトが入ってる
$session->load; #保存されている情報を取得
$session->create unless $session->sid; #セッションが発行されていないようなら、新規発行
$session->data('データのkey'); #セッションに保存されている情報のうち、指定した値を取得
$session->extend_expires; #セッションの有効期限を再設定