け〜くんこと K.Ktouth のだらだらした日常と突発的に作るプログラムや読み物とかの雑多サイト
以前書いていたのが消えたので orz、いくつか調整した上で再度書いてみます。
Ramaze の認証にはシンプルな Auth ヘルパーと ユーザデータを使用した User ヘルパーがあります。
ユーザに関する情報がデータモデルなどになっているときは User 、単一の管理者に対する権限での認証なら Auth の方が使いやすいと思います。
で、肝心のパスワードの管理ですが、rails などの認証プラグインのように 暗号化されたパスワードと salt を組み合わせた認証を行いたい場合、以下の記事のコードが参考になると思います。
ただ、いくつかの点において補足したい点があるので、その辺を後述します。
(以下、補足のポイント)
User ヘルパーを使っている際、ログインしているかどうかは #logged_in? メソッドで判断できます。
上記サイトでのログイン認証チェックは、それを直接記述するか login_first メソッドを読んで判断させています。
シンプルですが、Ramaze には Aspect ヘルパーという、そう言う処理を行うためのヘルパーが標準で機能しています。
class MemberController < Ramaze::Controller
layout(:page) { !request.xhr? }
map '/member'helper :user
trait :user_model => (ユーザ情報に該当するデータモデル)# 以下のメソッドはログインしていないとアクセスできず、ログインフォームにリダイレクトされる
before(:index, :logout, :password, :edit, :list) do
redirect rs(:login) unless logged_in?
enddef index
enddef login
enddef logout
enddef password
enddef edit
enddef list
end
end
こう書くだけで、各メソッドで明示することなくログインチェックが可能です。
が、before メソッドには一つ面倒な作業があります。
つまり要認証メソッドが増えるたびに、before メソッドの記述を増やす必要があると言うことです。おおよそにおいて、こういった認証が必要なメソッドはコントローラ単位でまとまっているため、不要メソッドは(login メソッドのような)せいぜい一つか二つでしょう。
となれば、「login 以外のメソッド全部」という記述がしたくなるのが人情です。が、Aspect ヘルパーには before_except のようなメソッドはありません。
もちろん、かわりに before_all があるので、そちらで同様の処理をしたらいいわけですが……そこに落とし穴が。
先ほどの before メソッドを以下のように書いた場合、「終わらないリダイレクト処理」というエラーが出る事になります。
before_all do
redirect rs(:login) unless %w(login).include?(action.method) or logged_in?
end
Ramaze の Aspect ヘルパーは結構シンプルなもので、以下の点はきちんと把握しておかないと面倒なことになります。
before_all / after_all メソッドで登録出来るブロックは、一つだけ。
ヘルパーのソースを見ると、以下のようになっています。
def before_all(&block)
AOP[self][:before_all] = block
end
ご覧の通り、ブロックは一つしか保持できません。after_all も同様です。
before / after メソッドで登録できるブロックは、対象メソッドごとに一つだけ。
ヘルパーのソースを見ると、以下のようになっています。
def before(*names, &block)
names.each{|name| AOP[self][:before][name] = block }
end
名前単位で分かれているとはいえ、before_all と似たようなコードとなっています。after も同様です。
wrap メソッドは限定した状況でしか使えない
wrap メソッドには メソッド実行をラッピングして欲しいと考えてしまいますが……コードを見ると。
def wrap(*names, &block)
before(*names, &block)
after(*names, &block)
end
……という、かなり微妙な定義になっています。当然 before / after メソッドと排他利用となります。
before_all / after_all は 複数回呼ばれることがある
先ほどの「終わらないリダイレクト処理」はこれが原因です。
通常、layout メソッドを使ったページのテンプレートの定義をしていると思います。この場合、レンダリング処理は「メソッドの実行」→「レイアウトの実行」の順に行われ、各実行ごとに before_all → before → 処理 → after → after_all の各ブロックが呼び出されます。
レイアウト実行の際には action.method が nil になっているため、先ほどのような書き方では login メソッドを実行した後のレイアウト処理でリダイレクトが発生してしまい、永久ループ状態になっていたわけです。
これを踏まえた上で、再度修正すると……
before_all do
redirect rs(:login) unless action.method.nil? or %w(login).include?(action.method) or logged_in?
end
となります。
無条件リダイレクトではなく、状況、たとえば HTML で返すか JSON でエラーデータを渡すかを切り替えたいときとかには、さらに補足がありますが……それはまた別の機会に。
……ん? これだけ把握することが出てくると、最初のリンク先サイトのように login_first のような明示的手法の方が早いかも(ぉぃ
OVA『バカとテストと召喚獣 〜祭〜』上巻 [Blu-ray]
(メディアファクトリー)
新品 ¥ 4,409
中古 ¥ 3,680
OVA『バカとテストと召喚獣 〜祭〜』下巻 [Blu-ray]
(メディアファクトリー)
新品 ¥ 4,438
中古 ¥ 2,980
生徒会役員共DJCD「アニメ生徒会役員共が全部わかるラジオ、略して全ラ!...
(キングレコード)
新品 ¥ 2,238
中古 ¥ 1,850
WORKING!! 9 初回限定特装版 (SEコミックスプレミアム)
(高津 カリノ)
新品 ¥ 2,896
中古 ¥ 2,835
「声優グランプリ」公認!声優界<雀王>決定戦! <J-1グランプリ> V...
(オムニバス)
新品 ¥ 3,159
中古 ¥ 3,099
デッドライジング 2【CEROレーティング「Z」】
(カプコン)
新品 ¥ 2,740
中古 ¥ 1,010
スプリンターセル コンヴィクション
(ユービーアイ ソフト)
新品 ¥ 2,979
中古 ¥ 1,397
Xbox 360 250GB
(マイクロソフト)
新品 ¥ 34,980
中古 ¥ 25,400
学園黙示録 HIGHSCHOOL OF THE DEAD 7 オリジナル...
(佐藤 大輔)
新品 ¥ 9,800
中古 ¥ 4,797
学園黙示録 HIGHSCHOOL OF THE DEAD SECRET ...
(佐藤 大輔)
中古 ¥ 2,500
ソードアート・オンライン〈5〉ファントム・バレット (電撃文庫)
(川原 礫)
中古 ¥ 690
RPG W(・∀・)RLD6 ―ろーぷれ・わーるど― (富士見ファンタ...
(吉村 夜)
新品 ¥ 651
中古 ¥ 1
魔法少女リリカルなのはViVid (3)限定版 (角川コミックス・エース...
(藤真 拓哉)
新品 ¥ 1,680
中古 ¥ 1,338
魔法戦記リリカルなのはForce (3)限定版 (角川コミックス・エース...
(緋賀 ゆかり)
新品 ¥ 1,680
中古 ¥ 418
ダンジョンズ&ドラゴンズ第4版スターター・セット
(ジェームズ ワイアット)
新品 ¥ 4,980
中古 ¥ 4,311
アリアンロッド・サガ・リプレイ(5) 激闘のピースメイカー (富士見ド...
(菊池 たけし/F.E.A.R.)
新品 ¥ 693
中古 ¥ 190
アリアンロッド・サガ・コンチェルト 1 (電撃コミックス)
(佐々木 あかね)
新品 ¥ 599
中古 ¥ 90
堀さんと宮村くん(7)(ガンガンコミックスONLINE)
(HERO)
新品 ¥ 1,000
中古 ¥ 747
浅尾さんと倉田くん(3)(ガンガンコミックスONLINE)
(HERO)
新品 ¥ 690
中古 ¥ 370
7と嘘吐きオンライン―HERO個人作品集―(ガンガンコミックスONLIN...
(HERO)
新品 ¥ 710
中古 ¥ 158
ONE PIECE 65 (ジャンプコミックス)
(尾田 栄一郎)
NARUTO―ナルト― 59 (ジャンプコミックス)
(岸本 斉史)
ワンピース 海賊無双(通常版)(初回特典:オリジナルカスタムテーマ9種DLコード、ソーシャルゲーム専用レアフィギュア用コード同梱)
(バンダイナムコゲームス)
ドラゴンズドグマ(数量限定特典『バイオハザード6』体験版用DLコード同梱)
(カプコン)