本文
Restful Authentication with all the bells and whistlesにしたがうと、ザリガニが見ていた...。:railsforumのrestful_authenticationは素晴らしい!それを見てRESTfulの理解も深まるで紹介されているような機能ができるらしい。
- 「railsでhogehogeを作ってみる。」さんの関連記事を参考にチャレンジ
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
続く。