これを Rails アプリで実現する方法を考えてみました。
手続き型言語や Windows アプリでは、これは簡単です。単純に、初期画面をログイン画面にしておけば済みます。
ログイン画面を表示する
Rails でも初期画面をログイン画面にすることは出来ます。しかしブラウザで直接別画面のURLを打たれると、認証をスキップされてしまうでしょう。認証が済んでいるかどうかを検証するには、
before_filter :auth protected def auth !! session[:member] end |
これを全てのコントローラに書くのは DRY に反するので、application.rb に書きたいところです。
が、そうするとログイン画面に行くときにもチェックされてしまい、未認証ではねられることになります。
そもそも、未認証の時にブランク画面が表示されるのも気に入りません。やはり未認証ならログイン画面を表示して、ユーザーIDとパスワードの入力を促したいところです。
例えば、こんな感じです。
before_filter :auth protected def auth if not session[:member] redirect_to :controller => "signon", :action => "index", :type => "page" end end |
しかし、これは動きません。
飛ばされた先でまた before_filter :auth が実行されてしまうからです。結果、無限の入れ子になるので、エラーとなります。
幸い、Rails には呼び出し元を判断可能な変数が用意されています。これを利用して、無限ループを回避してみましょう。
before_filter :auth protected def auth return if params[:controller] == "signon" if not session[:member] redirect_to :controller => "signon", :action => "index", :type => "page" end end |
ちなみに、signon_controller.rb は、以下のようになっています。
class SignonController < ApplicationController def index render :action => 'login' end def authorize session[:member] = User.find_by_userId_and_password(params[:userID], params[:userPASS]) if session[:member] redirect_to :controller => "toppage", :action => "main", :type => "page" else flash[:notice] = 'ユーザーIDまたはパスワードが違います' render :action => "login" end end end |
以前に、Ruby のホームページがRadiant CMS で構築されていると書きました。 これも展開したディレクトリを RadRails のワークスペースにコピーして、メニューから[ファイル]-[インポート]とやれば Rails で扱えるようになります。 ただし、インストール手順で一カ所注意点があります(radiant-0.6.2です)。 RadRails の[rake tasks]タブで、[db:bootstrap]で[Go]……だと、スクリプトが途中で止まってしまいます。 ここだけは、コマンドプロンプトから、 rake development db:bootstrap などとして下さい。 後は付属ドキュメント(INSTALL)に従えば、難しくはないでしょう。 Radiant CMS に興味を持つ人が増え、便利なモジュールが増えたら、私も XOOPS からの乗り換えを考えます。という訳で、みんな、頑張って! って、前にも書いたな(^^ゞ |