FrontPage  Index  Search  Changes  Login

LoginEngineを使ってみる

LoginEngineとは?

LoginEngineRailsEnginesの一種で、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.*)があるような らば、それを消しておきましょう。

使い方

ただしくインストールと設定ができていれば、アプリケーションにアクセスし たとき、以下のようにログイン画面が出てきます。

login

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

signup

ここでユーザ名、メールアドレス、パスワードなど必要事項を入力すると、入 力したメールアドレス宛に以下のようなメールが届きます。

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 を実行しておけば、再びログインするときに元のアクション に戻ってこれます。

Last modified:2006/03/18 11:38:14
Keyword(s):
References:[SaltedHashLoginGeneratorを使ってみる] [FrontPage] [RailsでWikiクローンを作る10]