はじめに認証ありき

業務用アプリでは、最初にログイン画面を表示し、認証にパスした場合のみ次のメニューを表示する、といった制御を行うことが良くあります。
これを Rails アプリで実現する方法を考えてみました。
手続き型言語や Windows アプリでは、これは簡単です。単純に、初期画面をログイン画面にしておけば済みます。

ログイン画面を表示する

Rails でも初期画面をログイン画面にすることは出来ます。しかしブラウザで直接別画面のURLを打たれると、認証をスキップされてしまうでしょう。
認証が済んでいるかどうかを検証するには、
before_filter :auth

protected
def auth
 !! session[:member]
end
のようにすれば実現できそうです。session[:member]には、認証済みのユーザー情報を入れます。この場合、未認証ならブランクの画面が表示されます。
これを全てのコントローラに書くのは DRY に反するので、application.rb に書きたいところです。
が、そうするとログイン画面に行くときにもチェックされてしまい、未認証ではねられることになります。
そもそも、未認証の時にブランク画面が表示されるのも気に入りません。やはり未認証ならログイン画面を表示して、ユーザーIDとパスワードの入力を促したいところです。
例えば、こんな感じです。
before_filter :auth

protected
def auth
 if not session[:member]
  redirect_to :controller => "signon", :action => "index", :type => "page"
 end
end
signon_controller の index アクションへ飛ばします。
しかし、これは動きません。
飛ばされた先でまた 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 からの乗り換えを考えます。という訳で、みんな、頑張って! って、前にも書いたな(^^ゞ






サイト名: flyman のおもちゃ箱   http://www.kestrel.jp
この記事のURL:   http://www.kestrel.jp/modules/tinyd04/index.php?id=3