はじめに認証ありき
|
業務用アプリでは、最初にログイン画面を表示し、認証にパスした場合のみ次のメニューを表示する、といった制御を行うことが良くあります。
これを 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 からの乗り換えを考えます。という訳で、みんな、頑張って! って、前にも書いたな(^^ゞ
|
|
|