Catalyst でかんたんログインを実装する
前回の、Catalyst でオートログインとブラウザを閉じるまで有効な Cookie を共存の続きです。
mixi などで実装されている、携帯端末固有情報や契約者識別情報を利用した、「かんたんログイン」を実装する方法を紹介します。
前回の、Catalyst でオートログインとブラウザを閉じるまで有効な Cookie を共存の続きです。
mixi などで実装されている、携帯端末固有情報や契約者識別情報を利用した、「かんたんログイン」を実装する方法を紹介します。
Catalyst::Plugin::Session では、デフォルトではセッションの有効期限は $c->config->{’session’}{’expires’} の値に固定です。
ですので、「次回からログインを省略する」のようなオートログイン機能を実装するには、セッションの expires を動的に変更する必要があります。
Catalyst - Session管理とHTMLエンティティコード(数値文字実体参照) でも言及されているように、Catalyst::Plugin::Session::State::URI を使っていると、
<img alt="日本語" />
などが、エスケープされてしまい、表示がおかしくなったりします。
Catalyst::Plugin::FillInForm::ForceUTF8 に抜けがあったのでパッチ書きました。
--- lib/Catalyst/Plugin/FillInForm/ForceUTF8.pm.orig 2009-02-08 14:39:24.000000000 +0900
+++ lib/Catalyst/Plugin/FillInForm/ForceUTF8.pm 2009-02-08 14:40:02.000000000 +0900
@@ -115,11 +115,13 @@
sub fillform {
my $c = shift;
my $fdat = shift || $c->request->parameters;
+ my $additional_params = shift;
$c->response->output(
HTML::FillInForm::ForceUTF8->new->fill(
scalarref => \$c->response->{body},
- fdat => $fdat
+ fdat => $fdat,
+ %$additional_params,
)
);
}
Catalyst.pm で
if ( $c->debug ) {
$c->stats(Tree::Simple->new([gettimeofday]));
$c->res->headers->header( 'X-Catalyst' => $Catalyst::VERSION );
}
と、ありますので、環境変数 CATALYST_DEBUG を 0 にしてあげると、出力されなくなります。
nitsuji さんが和訳されてらっしゃる、Catalyst::Manual::Cookbook に CATALYST_DEBUG 環境変数について触れています。
Enable debug status in the environment
ふつうは-Debugフラグをuser Catalystに追加してデバッグ情報を有効にする。けど、環境変数を使ってもできるのでアプリケーションを変更しなくてもデバッグ情報を有効にできる。CATALYST_DEBUGか<MYAPP>_DEBUGをtrueにすればいい。
物凄い便利です。
FormValidator::Simple だけでも充分便利すぎるのに、FillInForm はテンプレートに条件分岐などかかなくても勝手に value アトリビュートを探して値を入れてくれるし、WebForm もフォームから一発で DB を更新してくれたりします。FormValidator::Simple::Auto が DBIC_UNIQUE に対応してないそうなので(試していません)、そこが対応になればもう言うことないですね。
WebForm の情報が少なく、導入に手間取ったのでメモを残しておきます。
DBIx::Class::Schema::Loader で自動生成した Schema クラスに以下のように追加。
package MyApp::Schema::User;
use base 'DBIx::Class';
use base 'DBIx::Class::WebForm';
以上で、以下のように楽できます。
my $f = $c->form( -VALIDATION- );
my $u = $c->model('Schema::User')->find($id)
$u->update_from_form($f);
Root.pm の end で以下のようにしているのですが、
$c->stash->{fdat} ||= $c->req->parameters;
$c->fillform($c->stash->{fdat});
たまに挙動がおかしく、デバッグしながら追ってみると、
fillform() の呼び出し以前に、$c->log->dumper($c->req->parameters); としているとデータが fillin されないことが分かった。
$c->log->debug($c->req->parameters); だと大丈夫。
おそらく、parameters の内部のポインタを dumper が進めてしまっているのだろう。
ポインタを戻す方法とかありそうだけど、今はドキュメント探したり、ソースを追っている時間が無いので、とりあえず原因が分かったということで他の方法で回避することにする。
最近のコメント