user_engineを組み込む

CSVファイルをアップロードして、閲覧制限をかけて表示する、という基本的な機能が実装できたので、これからは運用上必要なユーザー権限を設定しようと思う。自分の中では、権限管理と言えば、以前Softwarebookで利用したuser_engineなのだ。早速、インストールの開始。

作業手順

  1. 以前に日本語化したuser_engineを、vender/pluginsフォルダにコピーした。
  2. config/environment.rbへの追記
  3. app/controllers/application.rbへの追記
  4. app/helpers/application_helper.rbへの追記
  5. app/views/layouts/user.rhtmlへの追記
  6. app/controllers/user_controller.rbへの追記
  7. app/models/user.rbへの追記
  8. Rakeタスク db:migrate:engines VERSION=0の実行
  9. Rakeタスク db:migrate:enginesの実行
  10. Rakeタスク bootstrapの実行
  11. Rakeタスク tmp:clearを実行
  12. WEBrickサーバーを再起動

久々に使ってみた注意点

久々にuser-engineを使ってみると、忘れていることが多々あり、少々悩んでしまったのでメモ。

  • すでにlogin_engineを利用中だと、login_engineのカスタマイズのため、app/controllers/user_controller.rb、app/models/user.rbを追加済みのことが多い。その場合、user_engineにも同じファイル名のコードが存在するので、それぞれのコードを合併しておく必要がある。(user_engineのコードをコピーして、login_engineのコードの下に貼り付けた。)
  • db:migrate:engines VERSION=0を実行して、一度login_engineも含めてデータベースを初期化してしまった方が、無駄に悩まなくて済む。
  • user_engineの挙動がおかしいと思った時は、Rakeタスクからtmp:clearを実行して、サーバーを再起動すると解決するかもしれない。
  • 最初はAdmin権限でログインして、User権限のアクセス権限(Permission)を正しく設定する必要がある。初期状態のまま新規ユーザーを追加しても、正常にアクセスできない。
    • ログインしても、csvsやdisplaysコントローラーのアクセス権が一つも無いからだ。
    • ここではとりあえず、csvsとdisplaysコントローラーの全てのアクセス権を有効にしておいた。
  • 新たにメソッドを定義したら、必ず、Rakeタスクから、bootstrapを実行する。

追記したコードの一覧

2) config/environment.rb
$KCODE = 'u'
require 'jcode'
# Be sure to restart your web server when you modify this file.

...(途中省略)...

# Include your application configuration below
require 'gettext/rails'
ENV['MSGMERGE_PATH'] = '/Applications/Locomotive2/Bundles/standardRailsSept2006.locobundle/i386/bin/msgmerge'

module LoginEngine
  config :salt, "zarigani"
  config :use_email_notification, false
  config :changeable_fields, [ 'firstname', 'lastname' ]
end

module UserEngine
  config :admin_login, "zarigani"
  config :admin_email, "zarigani.watch@gmail.com"
  config :admin_password, "zarigani"
end

Engines.start :login, :user
UserEngine.check_system_roles
3) app/controllers/application.rb
# Filters added to this controller will be run for all controllers in the application.
# Likewise, all the methods added will be available for all controllers.
require 'login_engine'

class ApplicationController < ActionController::Base
  init_gettext "csv_server"
  
  include LoginEngine
  include UserEngine
  
  helper :user
  model :user
  
  # before_filter :login_required
  before_filter :authorize_action
end
4) app/helpers/application_helper.rb
# Methods added to this helper will be available to all templates in the application.
module ApplicationHelper
  include LoginEngine
  include UserEngine
end
5) app/views/layouts/user.rhtml
以下の内容で、ファイルを新規追加した。
<html>
<head>
  <title><%= controller.controller_name %>: <%= controller.action_name %></title>
  <%# スタイルシートは、後の設定が優先される %>
  <%= stylesheet_link_tag 'scaffold' %>
  <%= engine_stylesheet 'login_engine' %>
  <%= engine_stylesheet 'user_engine' %>
  <%= engine_javascript "user_engine" %>
</head>

<body>
<% for name in [:notice, :warning, :message] %>
  <%= "<p style=\"color: green\">#{flash[name]}</p>" if flash[name] %>
<% end %>

<%= yield  %>
</body>
</html>
6) app/controllers/user_controller.rb
login_engineとuser_engineのコードを合併した。(コードは長いので省略)
7) app/models/user.rb
login_engineとuser_engineのコードを合併した。
class User < ActiveRecord::Base
  include LoginEngine::AuthenticatedUser
  include UserEngine::AuthorizedUser
  
  untranslate :salt, :salted_password, :verified, :role, :security_token,
              :token_expiry, :created_at, :updated_at, :logged_in_at,
              :deleted, :delete_after

  N_("User|Password")

  # Returns the full name of this user.
  def fullname
    _("%{firstname} %{lastname}") % {:firstname => firstname, :lastname => lastname}
  end
end


以上で、LoginEngine、UserEngineとも、正常に機能するようになった!