こんにちは,五十嵐です.全体像を見ながら (「
[Secure-SBM:002] 全体像」 参照) ,admin 用の認証を追加します.全体の認証は lib/SecureSBM.pm の auto アクションで行いました ( 「
[Secure-SBM:012] いよいよ認証」 参照) ので,Admin のコントロールに auto アクションを追加します.auto アクションの役割については 「
[Secure-SBM:013] ひと休み」 をご覧ください.
lib/SecureSBM/Contoroller/Admin.pm:
sub auto : Private {
my ( $self, $c ) = @_;
if( $c->user_exists ){
if( $c->user eq 'admin' ){
return 1;
}else{
$c->res->redirect($c->uri_for('/personal'));
return 0;
}
}
$c->res->redirect($c->uri_for('/'));
return 0;
}
まず,認証が済んでいるかどうかを "$c->user_exists" で確認します.認証が済んでいなければ '/' へリダイレクト,済んでいても 'admin' ユーザではなければ '/personal' へリダイレクトします.admin ユーザだけが,このコントローラで定義したアクションを利用することができます.
同様に Login.pm も変更します.
lib/SecureSBM/Controller/Login.pm:
@@ -42,7 +42,7 @@
if( $loginname eq 'admin' ){
$c->res->redirect($c->uri_for('/admin'));
}else{
- $c->res->redirect($c->uri_for('/'));
+ $c->res->redirect($c->uri_for('/personal'));
}
return;
} else {
lib/SecureSBM/Controller/Root.pm には,これ以上アクションを追加しないようにします.認証を必要としないアクションは,Nonauth::Bookmark, Nonauth::Profile を新たに追加して,これに記述していくようにします.
$ ./script/securesbm_create.pl controller Noauth::Bookmark
created "...(省略)/lib/SecureSBM/Controller/Noauth"
exists "...(省略)/t/Controller"
created "...(省略)/lib/SecureSBM/Controller/Noauth/Bookmark.pm"
created "...(省略)/t/Controller/Noauth-Bookmark.t"
$ ./script/securesbm_create.pl controller Noauth::Profile
exists "...(省略)/lib/SecureSBM/Controller/Noauth"
exists "...(省略)/t/Controller"
created "...(省略)/lib/SecureSBM/Controller/Noauth/Profile.pm"
created "...(省略)/t/Controller/Noauth-Profile.t"
$
Personal コントローラを追加します.
$ ./script/securesbm_create.pl controller Personal
exists "...(省略)/lib/SecureSBM/Controller"
exists "...(省略)/t/Controller"
created "...(省略)/lib/SecureSBM/Controller/Personal.pm"
created "...(省略)/t/Controller/Personal.t"
$
Noauth コントーラ下のアクセスでは認証が必要ないように,Root::auto に Noauth コントローラかどうかを判断する条件文を追加します.
lib/SecureSBM/Controller/Root.pm:
sub auto : Private {
my ( $self, $c ) = @_;
# Controller が Login,Root,Noauth の場合には,認証を必要としない
if ( $c->controller eq $c->controller('Login')
|| $c->controller eq $c->controller('Root')
|| $c->controller eq $c->controller('Noauth')
){
これで,認証が必要な部分と必要ない部分を明確に分けることができるようになりました.
/bookmark でアクセスするブックマークリストを簡単に作っておきます.
lib/SecureSBM/Controll/Noauth/Bookmark.pm:
sub bookmark : Path('/bookmark') {
my ( $self, $c ) = @_;
$c->stash->{pagetitle} = 'Secure-SBM 最新ブックマークリスト';
$c->stash->{template} = 'noauth/bookmark.tt';
if( my $rdb =
$c->model('SecureSBMDB::Role')->find( {role_name => 'public'} )
){
$c->stash->{bookmarks} = $rdb->bookmarks
}
}
role が public のブックマークのみを抜き出しています.スキームの設定時に bookmarks を many_has_many で設定しているので,bookmarks データベースへのアクセスが非常に簡単になっています.
center 部分のテンプレートは次のようになります.
root/template/noauth/bookmark_center.tt:
<h1>ブックマーク リスト</h1>
[% FOREACH v_bookmark = bookmarks.all -%]
<div class="each_bookmark"
id="public_bookmark[% v_bookmark.bookmark_id %]">
<a href="[% v_bookmark.bookmark_uri %]">[% v_bookmark.bookmark_title %]</a>
</div><!-- end of public_bookmark[% v_bookmark.bookmark_id %] -->
[% END %]
画面はこんな感じ.

もう少し細かく設定しなければなりませんが,当初はこれでいいでしょう.
次に,/personal ページ.これは各ユーザ用のトップページになります.これも簡単に設定しておきましょう.
lib/SecureSBM/Controller/Personal.pm:
sub auto : Private {
my ( $self, $c ) = @_;
if( $c->user_exists ){
return 1;
}
$c->res->redirect($c->uri_for('/login'));
return 0;
}
sub personal : Path('/personal') {
my ( $self, $c ) = @_;
if( my $udb =
$c->model('SecureSBMDB::User')->find( {user_email => $c->user} )
){
$c->stash->{user} = $udb;
}
$c->stash->{pagetitle} = 'Secure-SBM User Top Page';
$c->stash->{template} = 'personal/personal.tt';
}
auto のアクションは冗長ではありますが,設定しておきます.
center 部分のテンプレートは次のようになります.
root/template/personal/personal_center.tt:
<h1>ユーザページ</h1>
[% IF user -%]
ようこそ [% user.user_surname %] [% user.user_name %] さん.
[% END -%]
簡単に Welcome メッセージを出しておきます.
最後に,logout ができるようにしておきましょう.Logout アクションは既に作成済み (「
[Secure-SBM:012] いよいよ認証」 参照) ですので,メニューにリンクを追加するだけです.Login した状態と Login していない状態で,トップのメニューの表示を変えるように設定します.
root/template/top.tt には既に以下のような設定がしてあります.
[% IF logintoggle %]
[% logintoggle %]
[% ELSE %]
<a href="/login">Login</a>
[% END %]
この logintoggle を設定すれば良いことになります.そこで,Root::auto でこの logintoggle を設定します.
lib/SecureSBM/Controller/Root.pm:
@@ -32,6 +32,13 @@
$c->log->debug( '*** Controller [' . $c->controller . '].' );
$c->log->debug( '*** action [' . $c->req->action . '].' );
+ # ログインしているか否かでメニューを変更する.
+ if ($c->user_exists) {
+ $c->stash->{logintoggle} = '<a href="/logout">Logout</a>';
+ }else{
+ $c->stash->{logintoggle} = '<a href="/login">Login</a>';
+ }
+
# Controller が Login,Root,Noauth の場合には,認証を必要としない
if ( $c->controller eq $c->controller('Login')
|| $c->controller eq $c->controller('Root')
ログインしていれば "Logout" のメニュー,ログインしていなければ "Login" のメニューを表示します.
これで,大まかな認証の設定は終わりました.次回以降はもう少し細かい設定をおこなっていきます.
2007/03/26 記
参考:
Keyword: Perl Catalyst Secure-SBM SSBM セキュア・ソーシャル・ブックマーク