login_engineとauth_generator

login_engineとauth_generatorの比較
http://api.rails-engines.org/login_engine/files/vendor/plugins/login_engine/README.html
http://penso.info/rails/auth_generator

同じ機能

login, signup, forgot passwordなどの画面を提供する。
(login_engineはメールを使うかどうかを選べるが) signupのメールに示されたURLにアクセスして初めてユーザが有効になる。

違う機能

auth_generatorには管理者用の画面がある(英語のみ)が、login_engineにはない。
auth_generatorにはユーザにdomains(=権限?)があるが、login_engineにはない。

auth_generatorはgemでインストール。pluginではない。実際に動作するMVCのクラスは$RAILS_ROOT/app以下に生成される。
login_engineはengineの一種。pluginとして配布されている。実際に動作するMVCのクラスは$RAILS_ROOT/vendor/plugins/login_engineにある。

Controllerでのアクセス制限

auth_generatorでは以下のように書く

  def list
    require_auth 'admin'
    ・・・
  end

ログインされていない場合はログイン画面に、権限が足りない場合はアクセスできないことを示す画面に遷移する。


login_engineでは

class BookController < ApplicationController
    before_filter :login_required, :only => [:myaccount, :changepassword]
    before_filter :login_required, :except => [:index]

という感じ。ユーザにroleという属性はあるけど、なんか使われてないっぽい。
vendor/plugins/login_engine/lib/login_engine/authenticated_system.rb
をざーっと見たんですけど、roleで制限かけられるメソッドは見当たらなかったっす。

テーブル

login_engine

mysql> show fields from users;
+-----------------+-------------+------+-----+---------+----------------+
| Field           | Type        | Null | Key | Default | Extra          |
+-----------------+-------------+------+-----+---------+----------------+
| id              | int(11)     |      | PRI | NULL    | auto_increment |
| login           | varchar(80) |      |     |         |                |
| salted_password | varchar(40) |      |     |         |                |
| email           | varchar(60) |      |     |         |                |
| firstname       | varchar(40) | YES  |     | NULL    |                |
| lastname        | varchar(40) | YES  |     | NULL    |                |
| salt            | varchar(40) |      |     |         |                |
| verified        | int(11)     | YES  |     | 0       |                |
| role            | varchar(40) | YES  |     | NULL    |                |
| security_token  | varchar(40) | YES  |     | NULL    |                |
| token_expiry    | datetime    | YES  |     | NULL    |                |
| created_at      | datetime    | YES  |     | NULL    |                |
| updated_at      | datetime    | YES  |     | NULL    |                |
| logged_in_at    | datetime    | YES  |     | NULL    |                |
| deleted         | int(11)     | YES  |     | 0       |                |
| delete_after    | datetime    | YES  |     | NULL    |                |
+-----------------+-------------+------+-----+---------+----------------+
16 rows in set (0.06 sec)

auth_generator

mysql> show fields from users;
+---------------+--------------+------+-----+---------------------+----------------+
| Field         | Type         | Null | Key | Default             | Extra          |
+---------------+--------------+------+-----+---------------------+----------------+
| id            | int(11)      |      | PRI | NULL                | auto_increment |
| login         | varchar(80)  | YES  |     | NULL                |                |
| cryptpassword | varchar(40)  | YES  |     | NULL                |                |
| validkey      | varchar(40)  | YES  |     | NULL                |                |
| email         | varchar(100) |      |     |                     |                |
| newemail      | varchar(100) | YES  |     | NULL                |                |
| ipaddr        | varchar(15)  |      |     |                     |                |
| created_at    | datetime     |      |     | 0000-00-00 00:00:00 |                |
| updated_at    | datetime     |      |     | 0000-00-00 00:00:00 |                |
| confirmed     | tinyint(1)   |      |     | 0                   |                |
| domains       | text         |      |     |                     |                |
| image         | text         | YES  |     | NULL                |                |
| firstname     | varchar(40)  |      |     |                     |                |
| lastname      | varchar(40)  |      |     |                     |                |
+---------------+--------------+------+-----+---------------------+----------------+
14 rows in set (0.05 sec)

domainsの中身は"user,2 admin,1"みたいな感じで、userレベル2、管理者レベル1みたいに扱うらしい。


インストール方法

login_engine

ruby script/plugin install engines
ruby script/plugin install login_engine

で、コードを変更して、テーブルをrakeで作ればOK。簡単。


auth_generator
まずファイルをダウンロード

gem install <file>
ruby /script/generate auth account

で、コードを変更して、db/user.mysqlを実行してテーブルを作ればOK。ちょっとめんどくさい。

まとめ

権限でログインを制限できるっていう意味で、auth_generatorの方が便利なんだけど、あんまり使われてないような気がする。
確かにいちいち全てのメソッドにアクセス制限を書くのは面倒くさいもんね。それともlogin_engineの実装がかっこいいから?

auth_generatorがengineになってたらいいのになー。