Login Engineのインストールとテスト

さて、ここから本格的な開発に入りますが、まず、このシステムはユーザごとに違う情報を表示することになるので、まずユーザ管理が必要になります。RailsにはLogin Engineという高機能かつ柔軟なプラグインがありますので、これを使うことにしました。

また、そのインストールですぐにデータベースを使いますので、migrationという機能を使って管理することにします。

参考にしたページは以下の通りです。

Login Engineのインストールは、"Download in Rails Engines"というページを参考に、subversionを使った方法を試してみることにしました。

$ cd coreserve
$ svn propset svn:externals "engines http://svn.rails-engines.org/plugins/engines" vendor/plugins
$ svn propset svn:externals "login_engine http://svn.rails-engines.org/plugins/login_engine" vendor/plugins
$ svn update

セットアップは、下記の内容をconfig/environment.rbに追加すればいいようです。

module LoginEngine
  config :salt, "my-salt"
  config :email_from, "(メールアドレス)"
  config :admin_email, "(メールアドレス)"
  config :app_name, "CoReserve"

  config :use_email_notification, false
  config :confirm_account, false
end

Engines.start :login

configの最後の2行は、メールによるユーザの確認確認をバイパスする為に必要になります。

ここでひとつ問題が起きました。generate等のスクリプトが動作しないのですが、原因はどうもlogin_engineの一部のソースがロードされないようです。いろいろ試行錯誤して、下記のようにロードパスにプラグインディレクトリを追加することで解決しました。

これは、login_engine側の問題のようなので、当面、この状態で様子を見て、時間がある時にもう一度、再現テストをした上で開発元に報告しようと思います(情報求む)。

(下記の内容をconfig/environment.rbの先頭に追加)

$: << "vendor/plugins/login_engine/lib/login_engine/"

ここで、migrate用のスキーマの雛形を作成します。

$ ruby script/generate migration InitialSchema

とりあえずは、LoginEngine用のテーブルしか使わないので、vendor/plugins/login_engine/db/migrate/001_initial_schema.rbの内容を、db/migrate/001_initial_schema.rbにコピーします。

後程、Userテーブルに項目(クライアントとカウンセラーを区別するフラグ等)を追加すると思うので、コピーして使うことにしました。

これで、次のコマンドを実行すると、開発用のデータベースに、001_initial_schema.rbの内容に相当するテーブルが作成されます。

$ rake migrate

以下、本来migrateの使用法としては、データベースのバージョンごとに別ソースでスキーマを追加していくようですが、下記のコマンドを打つと、初期化した上で再作成するようなので、当分は、これで001_initial_schema.rbを修正していく方法で行なおうと思います。

$ rake migrate VERSION=0 ;rake migrate --trace

そして、app/controllers/application.rbを変更します。

# (app/controllers/application.rb)
require 'login_engine'

class ApplicationController < ActionController::Base
  include LoginEngine
  helper :user
  model :user
end

そして、TestLoginというコントローラを作成して、このLoginEngineの機能をテストすることにします。

$ ruby script/generate controller -f TestLogin index

before_filterで、 :login_requiredというメソッドを呼ぶと自動的にログインを要求するようになるようです。

secretというメソッドを追加して、ゲストにはここを見せないようにしてみます。

# app/controllers/test_login_controller.rb
class TestLoginController < ApplicationController
  before_filter :login_required, :only=>[:secret]

  def index
  end

  def secret
    render_text 'secret'
  end
end

生成されたapp/views/test_login/index.rhtmlを以下のように修正して、LoginEngineの機能をテストしてみます。

<h1>TestLogin#index</h1>

<% if current_user %>
<p>Hello, <%= current_user.login %></p>
<% else %>
<p>Hello, guest </p>
<% end %>
<ul>
<li><%= link_to "to secret page", :action=>'secret' %>
<li><%= link_to 'logout', :controller => 'user', :action => 'logout' %>
</ul>

以下のようなテストを行ないました。

  1. http://localhost:3000/test_login/にアクセス(Hello, guestと表示される)
  2. "to secret page"をクリック
  3. 自動的に/user/loginにリダイレクトされログインページが表示される
  4. "Register for an account"をクリック
  5. Singupページが表示されるので、入力してSingup(ユーザ登録)
  6. ログインページの戻るのでログイン
  7. 自動的にtest_login/secretにリダイレクトされ"secret"という文字が表示される
  8. 再度/test_login/にアクセス(Hello, xxxx(ユーザ名)と表示される)
  9. "to secret page"をクリックして再確認
  10. 再度/test_login/にアクセスして"logout"をクリック
  11. 2に戻る

indexのページはゲストにも見えて、secretのページはログインしないと見ることができないことが確認できました。

vendor/plugins/login_engine/lib/login_engine/の下の、authenticated_system.rbとauthenticated_user.rbのソースを見ることで、これの機能の概略はわかりそうです。