Home > howto > Catalyst でオートログインとブラウザを閉じるまで有効な Cookie を共存させる

Catalyst でオートログインとブラウザを閉じるまで有効な Cookie を共存させる

Catalyst::Plugin::Session では、デフォルトではセッションの有効期限は $c->config->{’session’}{’expires’} の値に固定です。

ですので、「次回からログインを省略する」のようなオートログイン機能を実装するには、セッションの expires を動的に変更する必要があります。

これは、C::P::Session::DynamicExpiryを使ってremember meに紹介されている、Catalyst::Plugin::Session::DynamicExpiry を使えば可能で、セッションと Cookie と両方の有効期限を変更してくれるので、

  1. オートログイン無効の場合、ログイン状態は一定時間、ブラウザを閉じてもログイン維持
  2. オートログイン有効の場合、ログイン状態は半永久的、ブラウザを閉じてもログイン維持

という仕様が実現できます。しかし、大抵のサイトでは、ログインセッションの要求仕様は以下になると思います。

  1. オートログインを無効の場合、ログイン状態はブラウザを閉じない限り継続
  2. オートログインを有効の場合、ログイン状態は永久的、ブラウザを閉じてもログイン維持

この要求を実現するには、セッションの有効期限の変更だけでなく、Cookie の有効期限の動的変更も必要になってきます。

これを、以下のように実装しました。

まずは、Catalyst::Plugin::Session::State::Cookie を継承して calculate_session_cookie_expires() をオーバーライドします。

lib/MyApp/WUI/Plugin/Session/State/Cookie.pm


package MyApp::WUI::Plugin::Session::State::Cookie;

use strict;
use warnings;
use parent 'Catalyst::Plugin::Session::State::Cookie';

sub calculate_session_cookie_expires {
    my $c = shift;
    if (defined(my $ttl = $c->session_time_to_live)) {
        $c->log->debug("Overridden session cookie time to live: $ttl");
        return time + $ttl;
    }
    return $c->config->{'session'}{'cookie_expres'};
}

1;

これを、プラグインとして読み込みます。

lib/MyApp/WUI.pm


use Catalyst qw/
    Session::DynamicExpiry
    Session
    Session::Store::DBIC
    +MyApp::WUI::Plugin::Session::State::Cookie
    Session::State::URI
/;

あとは、オートログインのパラメーターに応じて、Catalyst::Plugin::Session::DynamicExpiry の session_time_to_live() を呼んであげます。

lib/MyApp/WUI/Controller/Login.pm


if ($c->req->param('autologin')) {
    $c->session->{'autologin'} = 1;
    $c->session_time_to_live(2_592_000);
}

howto , ,

  1. コメントはまだありません。
  1. 2 月 27th, 2009 21:13 | #1

    [...] 前回の、Catalyst でオートログインとブラウザを閉じるまで有効な Cookie を共存の続きです。 [...]

    from Craftworks Tech Blog » Catalyst でかんたんログインを実装する