$c->user_existsと$c->userについて*[CPAN][Catalyst]
(途中)
Catalyst::Plugin::Authenticationの設定値として、
use_sessionというものがあります。
use_session Whether or not to store the user's logged in state in the session, if the application is also using the Catalyst::Plugin::Session plugin. This value is set to true per default.
と、CPANには書かれているのですが、設定することでどのフローが変わるのか、よくわかりません。
で、調べてみて、一言で言うと、
(※Catalyst::Plugin::Authentication::Store::DBICを使う場合)
『もしセッションがあれば、認証チェック[$c->user_exists]のときに、
セッションに$c->session->{__user}があれば認証OKとみなすYO!』
ってことです。
要するに、認証が通っているかどうかは、session->{__user}があるかないか イコール
sessionkeyである、cookieがあるかないかで判断される、ということです。
メカニズムは非常にシンプル。
一方、$c->userのフローに目を向けてみると、
$c->userでは、 $c->session->{__user}の値で、(login_id)でサーチを行います。
ここで食い違いがあると、
$c->user内で$c->get_userは、
sub get_user { $c->{auth}{catalyst_user_class}->new( $id, @rest );
{デフォルトでは、catalyst_user_class = Catalyst::Plugin::Authentication::Store::DBIC::User}
sub new { my ( $class, $id, $config ) = @_;
なので、
catalyst_user_classのnew(実際にdbアクセスするところ)は、
- $c->login(Credential::Password)
- $c->user(Authentication)
の2つから利用されることになります。
したがって、catalyst_user_classを拡張する場合に、
newメソッドを、ログインフォームからのことだけを考えて実装してはだめで、
$c->userとして、sessionに入っているlogin_idもこの引数となることを前提にしなければなりません。
ここでかなりはまりましたwww