Rails 2.3RC1で”Restful Authentication with all the bells and whistles”をやってみる

本文

Restful Authentication with all the bells and whistlesにしたがうと、ザリガニが見ていた...。:railsforumのrestful_authenticationは素晴らしい!それを見てRESTfulの理解も深まるで紹介されているような機能ができるらしい。

Restful Authentication with all the bells and whistles (new 9/05/08)#246がスタートみたいなのでここからスタートしてみる。

% rails myproject -d mysql
% cd myproject
% ruby script/plugin install http://svn.techno-weenie.net/projects/plugins/restful_authentication/

restful_authenticationを使ってセッション管理を作成。

% ruby script/generate scaffold Page title:string body:text
% ruby script/generate authenticated user sessions --include-activation

config/initializersにmail.rbというファイルを作成。例が載っているのでそれいしたがって作成してみる。以下を変更。

# Email settings
ActionMailer::Base.delivery_method = :smtp
 ActionMailer::Base.smtp_settings = {
 :address => "mail.yourapplication.com",
 :port => 25,
 :domain => "yourapplication.com",
  :authentication => :login,
  :user_name => "mail@yourapplication.com",
  :password => "yourapplicationpassword"  
 }

次に、config/environment.rbの"Rails::Initializer.run do |config|"の後ろの行に"config.active_record.observers = :user_observer"を付け加える。これによって登録やアクティベーションが終わった後にメールが利用者に送られるようになるらしい。

次にapp/model/user_mailer.rbを修正する。パスワードの再発行を付け加えるみたい。

% diff user_mailer.rb.org user_mailer.rb
5,7c5,7
<   
<     @body[:url]  = "http://YOURSITE/activate/#{user.activation_code}"
<   
---
> 
>     @body[:url]  = "http://localhost:3000/activate/#{user.activation_code}"
> 
9c9
<   
---
> 
13c13
<     @body[:url]  = "http://YOURSITE/"
---
>     @body[:url]  = "http://localhost:3000/"
15c15,26
<   
---
> 
>   def forget_password(user)
>     setup_email(user)
>     @subject    += 'You have requested to change your password'
>     @body[:url]  = "http://localhost:3000/reset_password/#{user.password_reset_code}"
>   end
> 
>   def reset_password(user)
>     setup_email(user)
>     @subject    += 'Your password has been reset'
>   end
> 
19,20c30,31
<       @from        = "ADMINEMAIL"
<       @subject     = "[YOURSITE] "
---
>       @from        = "hogehoge@jp"
>       @subject     = "YourApplication - "

続いて、app/model/user_observer.rbを編集。user_mailer.rbの変更に対応。

% diff user_observer.rb.org user_observer.rb
7c7
<   
---
> 
9c9,10
<   
---
>     UserMailer.deliver_forgot_password(user) if user.recently_forgot_password?
>     UserMailer.deliver_reset_password(user) if user.recently_reset_password?

続いて役割と実行権限を付け加える。

% ruby script/generate scaffold Role rolename:string
% ruby script/generate model Permission

db/migrateにあるXXX_create_permissions.rbを編集。adminを用意する。

diff 20090209105435_create_permissions.rb.org 20090209105435_create_permissions.rb
4c4
< 
---
>       t.integer :role_id, :user_id, :null => false
6a7,21
>     #Make sure the role migration file was generated first
>     Role.create(:rolename => 'administrator')
>     #Then, add default admin user
>     #Be sure change the password later or in this migration file
>     user = User.new
>     user.login = "admin"
>     user.email = "info@yourapplication.com"
>     user.password = "admin"
>     user.save(false)
>     user.send(:activate!)
>     role = Role.find_by_rolename('administrator')
>     permission = Permission.new
>     permission.role = role
>     permission.user = user
>     permission.save(false)
10a26,27
>     Role.find_by_rolename('administrator').destroy
>     User.find_by_login('admin').destroy

XXX_create_users.rbを編集する。

% diff 20090209102704_create_users.rb.org 20090209102704_create_users.rb
14c14,15
<       
---
>       t.column :password_reset_code, :string, :limit => 40
>       t.column :enabled, :boolean, :default => true

app/modelのファイルを修正し、モデル間の依存関係を定義する。まずは、role.rb

% diff role.rb.org role.rb
1a2,3
>   has_many :permissions
>   has_many :users, :through => :permissions

次、permission.rb。この微妙な単数と複数形の違いは難しい。

% diff permission.rb.org  permission.rb
1a2,3
>   belongs_to :user
>   belongs_to :role

続く。