LoginEngineを使ってみる
LoginEngineとは?
LoginEngineは RailsEnginesの一種で、Railsアプリケーショ ンにユーザ認証の機能を付加するためのものです。 Engine とは、Railsアプリケーションに(既存のコードを変更することなく)い ろいろな機能を付加するプラグインです。
もともと SaltedHashLoginGeneratorという名前でジェネレータとして提供されていたものを Engine として再実装したのが LoginEngine です。
SaltedHashLoginGeneratorとは?
SaltedHashLoginGeneratorを使ってみるのページを参照。
なお、LoginEngineもLoginGeneratorも使わずに認証機構を実装した例が、 RailsでWikiクローンを作る10 にありますので、そちらも参考にしてください。
LoginEngineのインストールと設定
LoginEngineを動かすための最低限の手順を説明します。
注: Edge Rails で使う場合は Edge Rails でLoginEngineを使うも参照してください。
railsアプリケーション作成
いつも通り rails アプリケーションを作ります。
例:
% rails myapp % cd myapp
database.ymlの設定
config/database.yml を適切に設定します。
engines,login_engineのインストール
いろいろ方法がありますが、Railsに含まれている script/plugin コマンドを 使うのが簡単です。
まず、pluginコマンドのダウンロード元リストを以下のコマンドで更新します。
% ruby script/plugin discover
ダウンロード元として追加するサイトを聞いてくるので y か n で答えます。
その後、以下のコマンドで engines と login_engine をインストールします。
% ruby script/plugin install engines % ruby script/plugin install login_engine
他にも svn コマンドでチェックアウトする方法もあります。詳しくは RailsEnginesダウンロードページ や LoginEngine README を参照してください。
environment.rbの編集
config/environment.rb の末尾に以下のような行を追加します。
module LoginEngine config :salt, "my-salt" config :email_from, "webmaster@example.com" config :admin_email, "admin@example.com" config :app_name, "MyApp" end Engines.start :login
config の行で、LoginEngine のさまざまな設定を行うことができます。:salt は暗号化の際に salt として使用する文字列です。任意の文字列を指定できま す。
その他の config パラメータの意味にについては vendor/plugin/login_engine/lib/login_engine.rb を見てください。 environment.rb で指定すると login_engine.rb のパラメータを上書きできま す。
application.rbの編集
app/controllers/application.rb を以下のように編集します。
require 'login_engine' class ApplicationController < ActionController::Base include LoginEngine helper :user model :user before_filter :login_required (以下略)
この例では、アプリケーション全体に認証をかけます。特定のアクションのみ に認証を書けたい場合は befor_filter に :only や :expect オプションをつ けます。詳しくは http://api.rubyonrails.com/classes/ActionController/Filters/ClassMethods.html 等を参照してください。
application_helper.rbの編集
app/helpers/application_helper.rbにinclude LoginEngine という行を追加 します。
module ApplicationHelper include LoginEngine end
ActionMailerの設定
メールによるユーザ登録の確認通知やパスワードを忘れた場合の通知を行うた めに RailsのメールシステムであるActionMailerの設定をします。 環境に応じて、environments/development.rb, config/environments/test.rb, config/environments/production.rb に以下のような行を追加します。
ActionMailer::Base.server_settings = {
:address => "smtp.example.com",
:domain => "example.com",
:port => 25
}
実際には、環境に応じて上記以外にもパラメータの設定が必要になることがあ ります。
データベースの作成
config/database.yml が適切に設定されていることを確認します。そして、ア プリケーションのトップディレクトリで以下のコマンドを実行してユーザ認証 用のテーブルを作成します。
rake engine_migrate ENGINE=login
migration の情報は vendor/plugin/login_engine/db/migrate ディレクトリ にあります。デフォルトでは、テーブル名は "users" となりますが、もし変 更したい場合は envrionment.rb の LoginEngine の設定の中で以下のように すれば変更できます。
module LoginEngine # ... other options... config :user_table, "your_table_name" end
スタイルシート
LoginEngineデフォルトのスタイルシートを使いたい場合は、layout ファイル の <head> セクションに
<%= engine_stylesheet 'login_engine' %>
という行を追加します。
たとえば、LoginEngine のログイン画面を出すコントローラは UserController という名前なので、それのレイアウトファイルは app/views/layouts/user.rhtml というファイル(なければ作る)になります。 その中で以下のように指定します。
<html> <head> <title>MyApp</title> <%= engine_stylesheet 'login_engine' %> </head> <body> <%= @content_for_layout %> </body>
フラッシュメッセージについて
LoginEngineに付属する view ファイルでは、フラッシュ(flash)のメッセージ は一切出しませんので、必要ならば自分で表示するようにしなければなりませ ん。
LoginEngine は以下のような三段階の flash メッセージを用意しています。
- :warning - warning (failure) messages
- :notice - success messages
- :message - neutral (reminder, informational) messages
手っ取り早く表示するには、layoutファイルに以下のような行を追加します。
<% for name in [:notice, :warning, :message] %>
<% if flash[name] %>
<%= "<div id=\"#{name}\">#{flash[name]}</div>" %>
<% end %>
<% end %>
controllerやviewの入れ替え
LoginEngineの元々のcontrollerやviewはメッセージが英語になっています。 これを変更したい場合、vendor/plugin/login_engine/app 以下のファイルを 直接編集するのではなく、RAILS_ROOT/app に代わりのファイルを置くことで 変更できます。
たとえば、最初の Welcome 画面を変えたいときは、 vendor/plugin/login_engine/app/views/user/home.rhtml を RAILS_ROOT/app/views/user/home.rhtml としてコピーして、その中身を好き なように変更します。最初は RAILS_ROOT/app/views/user というディレクト リはないので自分で mkdir してください。
トラブルシューティング
インストール直後、sessionまわりでトラブルが発生することが多いようです。 インストールしたあと、セッションファイル(/tmp/ruby_sess.*)があるような らば、それを消しておきましょう。
使い方
ただしくインストールと設定ができていれば、アプリケーションにアクセスし たとき、以下のようにログイン画面が出てきます。

最初は Register for an account というリンクをクリックしてアカウント登 録を行います。

ここでユーザ名、メールアドレス、パスワードなど必要事項を入力すると、入 力したメールアドレス宛に以下のようなメールが届きます。
Subject: [MyApp] Welcome to MyApp! From: webmaster@example.com To: you@yourdomain.com Welcome to MyApp, Taro Yamada. Your login credentials are: login: taro password: pass1111 Please click on the following link to confirm your registration: <a href="http://www.example.com:3000/user/home?key=xxxxxxxx&user_id=1">Click me!</a> http://www.example.com:3000/user/home?key=xxxxxxxx&user_id=1
ユーザがメールに記載されているリンクにアクセスすると、登録したユーザ名、 パスワードでログインできるようになります。
プログラミング上のTips
ログインしているユーザ名
ログインしているユーザに関する情報は session[:user] に格納されています。 たとえば、ユーザ名を表示するには、view のファイルに以下のように書きま す。
username: <%= session[:user].login %>
ログアウト
ログアウトする user コントローラの logout アクションを呼び出します。 つまりログアウトリンクは以下のようにして作ります。
<%= link_to 'ログアウト', :controller => 'user', :action => 'logout' %>
store_location
store_location というメソッドを呼び出すと、現在のアクションの URL を記 憶させて、ログイン後にその URL にリダイレクトするようにできます。
たとえば、ログアウトのリンクがある view のアクションの中で store_location を実行しておけば、再びログインするときに元のアクション に戻ってこれます。

Keyword(s):
References:[SaltedHashLoginGeneratorを使ってみる] [FrontPage] [RailsでWikiクローンを作る10]