Railsåå¼·ä¼ ã«è¡ã£ã¦ããããã°ããæãã¤çç¶ãããããã¯çç¶ããã®ç¶æ ãæªãã£ãã®ã§ãä¹ ãã¶ãã®åå ã ãã§ããæåããæå¾ã¾ã§ã©ããé ãåãã¦ãªãã£ããå¦çã追ãã¤ããªãã¦ãåãè¿ããéãã£ããåå¿ãè¿ããªãã£ãããã人ã«ã¯ããããªãããå»å¸«ã«ã¯ãããæ«ããã£ããããªããã ã¨è¨ããã¦ãã¾ã£ããã©ããªãã»ã©ã¾ã æ¬èª¿åãããªããã
ãããæ°ãã¤ãã°ãã®åå¼·ä¼ãåæ°ãéãã¦ããããã2å¨å¹´ã ãã¤ãã®éãã®å½¢å¼ ã§ããã
ååã»ãã·ã§ã³
3ã¤ã®ã»ãã·ã§ã³ã«åãããã
- åå¿è ã»ãã·ã§ã³(acts_as_authenticated)
- Railsæ©ã¿äºç¸è«å®¤
- Ruby Hoedown 2007 ã®åç»ãè¦ã
ç§ã¯åå¿è ã»ãã·ã§ã³ã«åºãããªã¼ãã¼ã¯è«¸æ©ãããã¨ã¯ãããç§ãæãç©é¡ã§å£ãæã¾ãã¦ããã£ãã
acts_as_authenticatedã¨ã¯
acts_as_authenticatedã¨ã¯ãRailsã¢ããªã±ã¼ã·ã§ã³ã«ãã°ã¤ã³èªè¨¼æ©è½ãæä¾ãããã©ã°ã¤ã³ã§ãããã¦ã¼ã¶ã¼ç»é²ããã°ã¤ã³èªè¨¼ããã°ã¢ã¦ããªã©ã®æ©è½ã¯åºãæ§ã ãªã¢ããªã±ã¼ã·ã§ã³ã§ä½¿ãããã§ãããããæ¯åº¦æ¯åº¦ãããæ¸ãã®ã¯çµæ§é¢åã§ãããacts_as_authenticatedã¯ãã®é¨åãç°¡åã«ãããæ¯ãã¦ãã¦å®å ¨ãªå½¢ã§å®è£ ãã¦ãããã
å®éããã°ã¤ã³æ©è½ã¨ããã®ã¯å®åãã¿ã¼ã³ã§ããã®ã«æã§æ¸ããã¨ããã¨çµæ§é¢åãªãã®ã ãViewããDBã¾ã§ã®åã¬ã¤ã¤ã¼ã«ããã£ã¦ã»ãã¥ãªãã£ã«é¢ããé æ ®ã¯å¿è«æ±ããããããã¤ããã¸ãã¯ã®è¨è¿°ã¯DRYã§ãããããå¤æ´ã®æ´åæ§ãã¨ããªãã¦ããã»ã©å°ãé¨åããªãããã ãã¨èãã¦çé¢ç®ã«ãã£ã¦ããã¨æå¤ã¨æéãæãããacts_as_authenticatedã¯ããã®é¨åãç°¡åã«è§£æ±ºãã¦ãããã
以åã¯ãã®ç®çã®ãã©ã°ã¤ã³ã¨ããã¨Login Engineã主æµã§ãã£ãããRails 1.2以éã§ã¯Engineã·ã¹ãã ãåããªããªã£ããLogin Engineãã¡ã³ããã³ã¹ã¯åæ¢ãã¦ããããããããã¨ã§ãä»ã§ã¯acts_as_authenticatedãèªè¨¼ç¨ãã©ã°ã¤ã³ã®çé ã§ããã
ã¤ã³ã¹ãã¼ã«ã¨æ§æ
ã¤ã³ã¹ãã¼ã«æ¹æ³ã¯è³ã£ã¦æ®éã®Railsãã©ã°ã¤ã³ã§ããããã¤ãã®ãã¨ãã
$ ruby script/plugin install http://svn.techno-weenie.net/projects/plugins/acts_as_authenticated
ããã§ã vendor/plugins/acts_as_authenticated ã«ãã©ã°ã¤ã³ãæ ¼ç´ãããããã®ãã©ã°ã¤ã³ã¯ script/generate ã«å¯¾ãã¦æ°ãã2ã¤ã®ã¸ã§ãã¬ã¼ã¿ãæä¾ããã
- authenticated: ã¢ã«ã¦ã³ãç»é²/ãã°ã¤ã³æ©è½ãçæ
- authenticated_mailer: ã¢ã«ã¦ã³ãç»é²å¾ã®ã¡ã¼ã«ã«ããã¢ã¯ãã£ãã¼ã·ã§ã³ã®æ©è½ãçæ
ä»åã¯ãauthenticated_maileré¨åã«ã¤ãã¦ã¯å²æããã
acts_as_authenticatedã®ç¹å¾´ã®ï¼ã¤ã¯ãRailsã®ã©ã³ã¿ã¤ã ã«å¤ããä½ç¨ããã®ã§ã¯ãªããgeneratorãæä¾ããã«çã¾ãã¨ãããã¨ã§ãããçæãããã®ã¯å¹¾ããçã¯ããã«ããæ®éã®Railsã®MVCã§ãããããã¦ã¼ã¶ã¼ã¯Railsã¢ããªã±ã¼ã·ã§ã³éçºã«é¢ããç¥èãæ´»ç¨ãã¦ãããèªç±ã«ã«ã¹ã¿ãã¤ãºã§ããã
使ãæ¹
ãã©ã°ã¤ã³ãæä¾ãã¦ããauthenticatedã¸ã§ãã¬ã¼ã¿ãå©ç¨ããã
$ ruby script/generate authenticated MODEL CONTROLLER
ããã§ã MODEL ã¨ããã®ã¯ã¢ãã«ã¯ã©ã¹ã®ååã CONTROLLER ã¨ããã®ã¯ã³ã³ããã¼ã©ã®ååã§ãããä¾ãã°æ¬¡ã®ããã«ãªãã
$ ruby script/generate authenticated User Account exists app/models/ exists app/controllers/ exists app/helpers/ create app/views/account exists test/functional/ exists test/unit/ create app/models/user.rb create app/controllers/account_controller.rb create lib/authenticated_system.rb create lib/authenticated_test_helper.rb create test/functional/account_controller_test.rb create app/helpers/account_helper.rb create test/unit/user_test.rb create test/fixtures/users.yml create app/views/account/index.rhtml create app/views/account/login.rhtml create app/views/account/signup.rhtml create db/migrate create db/migrate/001_create_users.rb
ã¦ã¼ã¶ã¼æ
å ±ã表ãã¢ãã«ã¯ã©ã¹ User
㨠User
ãæä½ããããã® AccountController
ãåã³ä»éããviewããã¹ãã±ã¼ã¹ãçæãããã
ã¢ãã«ã¯ã©ã¹ã«å¯¾å¿ãããã¤ã°ã¬ã¼ã·ã§ã³( db/migrate/001_create_users
)ãçæããã¦ããã®ã§ãããè¦ã¦ã¿ããã
class CreateUsers < ActiveRecord::Migration def self.up create_table "users", :force => true do |t| t.column :login, :string t.column :email, :string t.column :crypted_password, :string, :limit => 40 t.column :salt, :string, :limit => 40 t.column :created_at, :datetime t.column :updated_at, :datetime t.column :remember_token, :string t.column :remember_token_expires_at, :datetime end end def self.down drop_table "users" end end
çæããæç¹ã§ã¯ã¾ã ãã¤ã°ã¬ã¼ã·ã§ã³ã¯å®è¡ããã¦ããªããä»ã®ãã¡ã«ã好ããªããã«ãã®ãã¤ã°ã¬ã¼ã·ã§ã³ãæ¸ãæãããã¨ãã§ãããä¾ãã°ãã¦ã¼ã¶ã¼æ å ±ã¨ãã¦ä¸è¨ã®ä»ã«ããã¯ãã¼ã ãå¿ è¦ã§ãããªããã®ã«ã©ã å®ç¾©ãå ããã°ãããä½åãªã«ã©ã ãããåã«ã¯acts_as_authenticatedã®åä½ã«å·®ãéããã¨ã¯ãªãã
ç§ã以åacts_as_authenticatedã使ã£ãéããã°ã¤ã³åã¯ã¡ã¼ã«ã¢ãã¬ã¹ã§å
¼ç¨ãã¦ãã(ãã®æ¹éã«ã¤ãã¦ã»ãã¥ãªãã£ä¸ã®æ¯éã¯ããã ããããä»ã¯åå¼ãã¦æ¬²ãã)ãã ããã login
ã«ã©ã ã®å®ç¾©ã¯åã£ã¦ãã¾ã£ããããã§ãå¾ã§ã¡ãã£ã¨æãå ããã ãã§åé¡ãªãåä½ããããã¨ãã§ããã
æ¢åã®ã¦ã¼ã¶ã¼ç®¡çãã¼ãã«ããããªãããã¯ããã¤ã°ã¬ã¼ã·ã§ã³ãã¢ãã«ã¯ã©ã¹ããããã£ã¦ä½ã¨ããã¦ããã°ãã®ãã¼ãã«ãacts_as_authenticatedã¨å ±åã§ããã
ãã¦ãããã§ã¯ãã®ã¾ã¾å¤æ´ããã«ãã®migrationãå®è¡ãããã
$ rake db:migrate == CreateUsers: migrating ===================================================== -- create_table("users", {:force=>true}) -> 0.0833s == CreateUsers: migrated (0.0835s) ============================================
ããã§ã users
ãã¼ãã«ãä½æããããããã§ããèªè¨¼æ©è½ãå©ç¨ã§ããããã®æ§åãæ®ã£ãã®ãåé ã®ã¹ã¯ãªã¼ã³ãã£ããã£ã§ãããç´ ã£æ°ã¯ãªãããæ©è½ã¯ååã§ããã
解å
acts_as_authenticatedãçæããAccountControllerã®ä¸èº«ãè¦ã¦ã¿ããã
ã¾ãç®ç«ã¤ã®ã¯ãåé ã®ãã®1è¡ã
include AuthenticatedSystem
acts_as_authenticatedã¯AuthenticatedSystemã¢ã¸ã¥ã¼ã«ãéãã¦ã³ã³ããã¼ã©ã¼ã«èªè¨¼æ©è½ãæä¾ãããAuthenticatedSystemã¢ã¸ã¥ã¼ã«ã¯ lib/authenticated_system.rb
ã«çæããã¦ãããèªè¨¼ã®è©³ããæ¹æ³ãå¤æ´ãããããã«ã¯ããã®ã¢ã¸ã¥ã¼ã«ãããããã°è¯ãã
ã¢ã«ã¦ã³ãç»é²
ãã¦ãã§ã¯ã¦ã¼ã¶ã¼ã¢ã¯ã·ã§ã³ã«æ²¿ã£ã¦é ã«è¦ã¦ããããã¢ã«ã¦ã³ãç»é²ããã«ã¯ãhttp://localhost:3000/account/signupã«ã¢ã¯ã»ã¹ããã
def signup @user = User.new(params[:user]) return unless request.post? @user.save! self.current_user = @user redirect_back_or_default(:controller => '/account', :action => 'index') flash[:notice] = "Thanks for signing up!" rescue ActiveRecord::RecordInvalid render :action => 'signup' end
æåã®2è¡ã¯Railsã§ã¢ãã«ãªãã¸ã§ã¯ããç·¨éããã¨ãã®é »åºãã¿ã¼ã³ã ããã¨ãã¾ãåå¿è
ã»ãã·ã§ã³ã ããããã®è¾ºããã©ãã¼ãä»ãä½ããã©ã¡ã¼ã¿ã¯æ¸¡ãã¦ããªãã®ã§ params[:user]
㯠nil
ã ãã©ãã¨ã«ããããã§ç¡çç¢ç User
ãªãã¸ã§ã¯ããä½ã£ã¦ãã¾ããã§ã GET
ã§ã¢ã¯ã»ã¹ãã¦ããããããã®å ´åã¯2è¡ç®ã§returnããã
returnå¾ã«ã¬ã³ããªã³ã°ããããã³ãã¬ã¼ã( app/views/account/signup.rhtml
)ãè¦ã¦ã¿ãã¨ãããªã£ã¦ããã
<%= error_messages_for :user %> <% form_for :user do |f| -%> <p><label for="login">Login</label><br/> <%= f.text_field :login %></p> <p><label for="email">Email</label><br/> <%= f.text_field :email %></p> <p><label for="password">Password</label><br/> <%= f.password_field :password %></p> <p><label for="password_confirmation">Confirm Password</label><br/> <%= f.password_field :password_confirmation %></p> <p><%= submit_tag 'Sign up' %></p> <% end -%>
ãã£ãã空㮠User
ãªãã¸ã§ã¯ããä½ã£ã¦ @user
ã«è¨å®ãã¦ããããé°ã§ã form_for
ãã«ãã¼ã使ã£ã¦æ¥½ã«è¨è¿°ã§ããã
ãã¦ããã®ãã³ãã¬ã¼ãã§çæããããã©ã¼ã ã¯å
ã¨åã account/signup
ã«å¯¾ãã¦POSTããããã«æ¸ããã¦ããããã¹ãããã¨ã©ããªãããåã³ã signup
ã¢ã¯ã·ã§ã³ã®å®ç¾©ã«æ»ãã
def signup @user = User.new(params[:user]) return unless request.post? @user.save! self.current_user = @user redirect_back_or_default(:controller => '/account', :action => 'index') flash[:notice] = "Thanks for signing up!" rescue ActiveRecord::RecordInvalid render :action => 'signup' end
ä»åº¦ã¯ããã©ã¼ã ã®å¤ã渡ã£ã¦ã㦠params
ã«å
¥ã£ã¦ããããã®ã¨ãã次ã®ãããªå¤ãéä¿¡ããã¨ãããã
Railsã®éæ³ã«ãããã©ã¼ã å ¥åã¯è§£æããã¦æ¬¡ã®ãããªHashã«ããæ§é ã«èªåçã«å¤æãããã
{ "user" => { "password_confirmation"=>"test", "login"=>"hoge", "password"=>"test", "email"=>"test@localhost" }, "commit"=>"Sign up", "action"=>"signup", "controller"=>"account" }
ã§ã params[:user]
ã使ã£ã¦ãä»åº¦ãã User
ãªãã¸ã§ã¯ããä½ãã®ã ã2è¡ç®ã«ããã¦ããä»åº¦ã¯POSTã¡ã½ããã§ã¢ã¯ã»ã¹ãã¦ããããããã§ã¯returnããªãã
ã§ã @user.save!
ãããã¸ã§ãã¬ã¼ã¿ãçæãã段é㧠User
ã¯ã©ã¹ã«ã¯ç´°ããvalidationãè¨å®ããã¦ããããã®ãããæ£ããç»é²æ
å ±ã§ããã°ä¿åãããä½ããééã£ã¦ããã°ä¾å¤ãçºçãããä»ã¯æ£å¸¸ç³»ãè¦ã¦ããã¨ãããã
current_user
ã¨ããå±æ§ã¯AuthenticatedSystemã¢ã¸ã¥ã¼ã«ã®å±æ§ã§ãå¾ã§è¦ãããã«ãã°ã¤ã³ç®¡çã®ä¸æ ¸ãçºããacts_as_authenticatedã®åºæ¬çãªä»çµã¿ã¨ãã¦ã¯ããã®å±æ§ã«ã¦ã¼ã¶ã¼æ
å ±ãªãã¸ã§ã¯ããå
¥ã£ã¦ããã°"ãã°ã¤ã³ç¶æ
"ãããã§ãªããã°"æªãã°ã¤ã³ç¶æ
"ã¨ãããã¨ã«ãªã£ã¦ãããã¤ã¾ããããã§ã¯ã¦ã¼ã¶ã¼ç»é²ã¨åæã«ãã°ã¤ã³ç¶æ
ã«ç§»è¡ãã¦ãã¾ãããã ã
ããã¦ããå
ã®ãã¼ã¸ãã¾ã㯠/account
ã«ãªãã¤ã¬ã¯ãããã以ä¸ããªãã¤ã¬ã¯ãå
ã¯ã¢ããªã±ã¼ã·ã§ã³ã«åããã¦èªç±ã«ä¿®æ£ããã°ããã
ããã§è³ªåãåºãã
å ¥åãä¸æ£ãªå ´åã¯ã©ããªãã®ã
validationã«å¤±æãã¦ãä¾å¤ãçºçãããæå¾ã®
rescue
ç¯ããããæã¾ãã¦ãåã³app/views/account/signup.rhtml
ãã¬ã³ããªã³ã°ãããerror_messages_for
ãã«ãã¼ããªããã®åãã§ãããªæãã«è¡¨ç¤ºãããã
ã¦ã¼ã¶ã¼æ å ±ã®ä¿å
ãã¦ãä¸ã§ã¯ã¦ã¼ã¶ã¼æ
å ±ã®ä¿åãããã¨ããã save!
ã§ä¿åãããã¨ã ãæµãã¦ãã¾ã£ããããã®ä¸èº«ã詳ããè¦ã¦ã¿ããã app/models/user.rb
ãè¦ãã
åé ã«ã¯validationã沢山ããããç»é²æã®å ¥åã¨ã©ã¼ãªãããå¼¾ãã¦ãããã
validates_presence_of :login, :email validates_presence_of :password, :if => :password_required? validates_presence_of :password_confirmation, :if => :password_required? validates_length_of :password, :within => 4..40, :if => :password_required? validates_confirmation_of :password, :if => :password_required? validates_length_of :login, :within => 3..40 validates_length_of :email, :within => 3..100 validates_uniqueness_of :login, :email, :case_sensitive => false
ããã§ããã? password
ãã¨æã£ã人ã¯åãããã£ãmigrationãè¦ãã¨ãã password
ãªãã¦ããã«ã©ã ã¯ãªãã£ãçã ãã ããããã®ã¾ã¾ãªã User
ãªãã¸ã§ã¯ãã«ã password
ãªãã¦ããå±æ§ã¯å®ç¾©ãããªãã
crypted_password
ã«ã©ã ãªããã£ããå®ã¯acts_as_authenticatedã§ã¯ãã¹ã¯ã¼ãã®SHA1ããã·ã¥ã ããä¿åããã®ã ãçãã¹ã¯ã¼ãã¯ä¿åããªããã¾ãããã¯ã»ãã¥ãªãã£ä¸ã®å®ç³ã£ã¦ãã¤ã ãã©ããã®ãããã®è§£èª¬ãã¡ããã¨ã»ãã·ã§ã³äºå®ã«çµã¿è¾¼ãã§ã諸æ©ããã¯åããRailsåå¿è
ã¨è¨ã£ã¦ãJavaçµé¨è
ã ã£ããããã¨ç¥ã£ã¦ãããç¥ããªããã©ãçµæ´ã¯æ§ã
ã ããã確ãã«ã»ãã·ã§ã³ãªã¼ãã¼ã¯é
æ
®ããã»ããããããã
ãã¦ãããã crypted_password
ã«å¯¾ãã¦çãã¹ã¯ã¼ãã¨æããã password
å±æ§ã¯ã©ãã«ãããã ãããè¦åãã¨ã User
ã¯ã©ã¹ã®åé ã§æ示çã«å®ç¾©ãã¦ããã
# Virtual attribute for the unencrypted password attr_accessor :password
ãããªã®ã ãå®ã¯Railsã®validationã¯ActiveRecordã§èªåçæãããå±æ§ä»¥å¤ã«ã使ããããã®å±æ§ãããããããã°ããã
ãã¦ã¨ãvalidationã®ããä¸ã«ãããªè¨è¿°ãããã
before_save :encrypt_password
ãããç»é²æã®éµã ããã®è¨è¿°ã«ãã User
ãªãã¸ã§ã¯ããä¿åããåã«ã¯å¿
ã encrypt_password
ã¡ã½ãããå¼ã°ããããã®ä¸èº«ãè¦ã¦ã¿ããã
def encrypt_password return if password.blank? self.salt = Digest::SHA1.hexdigest("--#{Time.now.to_s}--#{login}--") if new_record? self.crypted_password = encrypt(password) end
ãããçãã¹ã¯ã¼ãã§ãã password
å±æ§ãã crypted_password
å±æ§ã®å¤ãä½ãåºããä»çµã¿ã¯ããã
password
ã空ãªãä½ãããªããã¦ã¼ã¶ã¼æ¯ã«ä¸æã£ã½ã
salt
ãä½ããsalt
ã£ã¦ããã®ã¯ãäºåè¨ç®æ»æã«å¯¾ãã対çãããã·ã¥å¤ã¨å ±ã«DBã«ä¿åããããã§ã
encrypt
ã¡ã½ããã§crypted_password
ãä½ãã
encrypt
ã¯ãã¨ããã¨
# Encrypts the password with the user salt def encrypt(password) self.class.encrypt(password, salt) end
ä½ã£ã¦ããã salt
ã使ã£ã¦ã¯ã©ã¹ã¡ã½ããã® User::encrypt
ãå¼ã¶ãæ´ã«ãã®ä¸èº«ã
# Encrypts some data with the salt. def self.encrypt(password, salt) Digest::SHA1.hexdigest("--#{salt}--#{password}--") end
åãåã£ã salt
㨠password
ã使ã£ã¦SHA1ããã·ã¥ãä½ã£ã¦ãã ãã
åæ£ãã¦ãã®ã§é¢åã ãã©ãããã¯æåã«è¨ã£ããã¸ãã¯ãDRYã«ä¿ã¤ãããè¦ã¯ããªãã¸ã§ã¯ãã®ä¿ååã«çãã¹ã¯ã¼ãããsaltä»ãã®ããã·ã¥ãè¨ç®ããã¨ããã ãã ã以ä¸ããacts_as_authenticatedã®ã¢ã«ã¦ã³ãç»é²ã®æµãã§ãã£ãã
ãã°ã¤ã³
ã§ã¯ãç»é²å¾ã«ãã°ã¤ã³ããã¨ãããè¦ã¦ã¿ããããã°ã¤ã³ã«ã¯ã /account/login
ã«ã¢ã¯ã»ã¹ããã°ããã login
ã¢ã¯ã·ã§ã³ã®ä¸èº«ãè¦ã¦ã¿ããã
def login return unless request.post? self.current_user = User.authenticate(params[:login], params[:password]) if logged_in? if params[:remember_me] == "1" self.current_user.remember_me cookies[:auth_token] = { :value => self.current_user.remember_token , :expires => self.current_user.remember_token_expires_at } end redirect_back_or_default(:controller => '/account', :action => 'index') flash[:notice] = "Logged in successfully" end end
remember_me
ãã©ãã¨ãæ¸ãã¦ããã®ã¯ã»ãã·ã§ã³çµäºå¾ããã°ã¤ã³ç¶æ
ãä¿ã¤æ©è½ãããããã°ã¤ã³ãä¿ã¤ãã¨ãæ¸ãã¦ããæ©è½ãæä¾ããããã®ãã®ã ãä»åã¯æ·±ãã¯ç«ã¡å
¥ããªãã£ãããã®é¨åãå²æããã°ãã®ã¡ã½ããã¯ã·ã³ãã«ã ã
def login return unless request.post? self.current_user = User.authenticate(params[:login], params[:password]) if logged_in? redirect_back_or_default(:controller => '/account', :action => 'index') flash[:notice] = "Logged in successfully" end end
POSTã¡ã½ããã§ãªããã°ãã®ã¾ã¾æ»ãã®ã¯ signup
ã®ã¨ãã¨åããããã§ãã°ã¤ã³ãã©ã¼ã ãrenderãããã
ã§ããã®ãã©ã¼ã ããåã³ãä»åº¦ã¯POSTã§æ»ã£ã¦ããã¨ãã User::authenticate
ã¨ããã¯ã©ã¹ã¡ã½ãããèªè¨¼å¦çã®å®ä½ãããã
å¤å°æ¸ãæããã¨ããããªã£ã¦ããã
# Authenticates a user by their login name and unencrypted password. Returns the user or nil. def self.authenticate(login, password) u = find_by_login(login) # need to get the salt u && (u.crypted_password == u.encrypt(password) ? u : nil end
ãã£ã¦ããã¨ã¯ç°¡åã ã
ãã°ã¤ã³åã«åºã¥ãã¦
User
ãªãã¸ã§ã¯ããåå¾ãActiveRecordã®dynamic finderã使ã£ã¦ãã該å½ããã¬ã³ã¼ããããã°
User
ãªãã¸ã§ã¯ãããããã§ãªããã°nil
ãè¿ãã次ã®æ¡ä»¶ãæºããã¨ãã
u
ãè¿ããããã§ãªããã°nil
ãè¿ããu
ãUser
ãªãã¸ã§ã¯ãã§ãã£ã¦nil
ã§ã¯ãªããã¨u
ã®ä¿åããã¦ããããã·ã¥ã¨ãä»å ¥åãããçãã¹ã¯ã¼ããåãæé ã§ããã·ã¥åãããã®ã¨ããä¸è´ãã
ãµã¼ããããããããã¾ã AccountController
ã® login
ã¢ã¯ã·ã§ã³ã«æ»ããã
def login return unless request.post? self.current_user = User.authenticate(params[:login], params[:password]) if logged_in? redirect_back_or_default(:controller => '/account', :action => 'index') flash[:notice] = "Logged in successfully" end end
authenticate
ã¡ã½ããã¯ããã°ã¤ã³åã¨ãã¹ã¯ã¼ããä¸è´ããã°ãã®ã¦ã¼ã¶ã¼ã表ã User
ãªãã¸ã§ã¯ããããããªãã° nil
ãè¿ãã®ã§ãã£ããããã§ãããã current_user
å±æ§ã«è¨å®ã
åã«æ¸ããããã«ãå
é¨çã«ã¯ã current_user
ã« User
ãªãã¸ã§ã¯ããè¨å®ããã¦ããã== ããã°ã¤ã³ç¶æ
ã§ãããã¨ãããã¨ãªã®ã§ãã£ããããã§ãã°ã¤ã³çµããã
諸æ©ããã¯ããã®ã¢ã¯ã·ã§ã³ã§ã»ãã·ã§ã³ãåãæ¿ããªãã¨ã»ãã·ã§ã³åºå®æ»æããããã§ãªããã¨è¨ã£ã¦ããç§ãåæãããã¯ããããéãå¿ è¦ãããããã ã
ãã°ã¤ã³è¦æ±/å¤å¥
AccountControllerã¯ããã§è¯ãã¨ãã¦ãä»ã®Controllerã§ãã°ã¤ã³ãè¦æ±ããã«ã¯ã©ããããè¯ããã
class HogeController include AutheticatedSystem before_filter :login_required .... end
ããã ãã§ãããããã§ã HogeController
é
ä¸ã®ã¢ã¯ã·ã§ã³ã§ã¯å
¨ã¦ãã°ã¤ã³ãå¿
è¦ã¨ãªããæªãã°ã¤ã³ç¶æ
ã§ã¢ã¯ã»ã¹ãã㨠/account/login
ã«ãªãã¤ã¬ã¯ããããããã§ãã°ã¤ã³ããã¨å
ã®ã¢ã¯ã·ã§ã³ã«æ»ã£ã¦ããã
åå¿è ã»ãã·ã§ã³ãªã®ã§ãã£ã«ã¿ãç¥ããªã人ããããRailsã«ããããã£ã«ã¿ã£ã¦ããã®ã¯ãã¾ããJavaã®Servlet APIã®ãã£ã«ã¿ã¨åããããªããã§ããªã¯ã¨ã¹ããã¢ã¯ã·ã§ã³ã¡ã½ãããåãä»ããåããããã¯å¾ã«å¦çãæã¿è¾¼ããã¨ãã§ãããå ¥åºåãå å·¥ããããç¹å®ã®æ¡ä»¶ä¸ã§ã¯æ¬æ¥ã®ã¢ã¯ã·ã§ã³ã¡ã½ããã¸å¦çã移ããã«ä»ã¸ã¨ã°ããããã§ããã
対象ã¨ãªãã¢ã¯ã·ã§ã³ãçµãè¾¼ããã¨ãã§ããããã®ä¾ã§ã¯ãç¹å®ã®ã¢ã¯ã·ã§ã³ã«ã ããã°ã¤ã³ãè¦æ±ããããç¹å®ã®ã¢ã¯ã·ã§ã³ã ããã°ã¤ã³ããªãã¦ãè¯ãããã«ããããããã«ã¯ãããªæ§æãã¤ããã
before_filter :login_required, :only => [:foo, :bar]
ã¨ã
before_filter :login_required, :except => [:foo, :bar]
ã¨ãã
ãµã¼ããã§ããããã login_required
ãã£ã«ã¿ã®ä¸èº«ãè¦ã¦ã¿ãããããã§ãã°ã¤ã³ç¶æ
å¤å¥ã®æ¹æ³ãè¦ããã¨ãã§ããã¯ãã ãå®è£
㯠lib/authenticated_system.rb
ã«ããã
def login_required username, passwd = get_auth_data self.current_user ||= User.authenticate(username, passwd) || :false if username && passwd logged_in? && authorized? ? true : access_denied end
User::authenticate
ã¯ãã£ãè¦ããããç´°ãããã¨ã¯ãã¦ãããã¨ã«ãããã£ã±ã self.current_user
ãèãªã®ã ããããã current_user
å±æ§ã®å®è£
ãè¦ã¦ã¿ããã
# Accesses the current user from the session. def current_user @current_user ||= (session[:user] && User.find_by_id(session[:user])) || :false end # Store the given user in the session. def current_user=(new_user) session[:user] = (new_user.nil? || new_user.is_a?(Symbol)) ? nil : new_user.id @current_user = new_user end
getterãè¦ã¦ã¿ãã¨ãã¡ãã£ã¨ã³ã¼ããæå·§çã ã
- ã¤ã³ã¹ã¿ã³ã¹å¤æ°
@current_user
ãè¨å®æ¸ã¿ãªããããæ´»ãã ããã§ãªããã°
session[:user]
ãè¦ã¦ãã»ãã·ã§ã³å¤æ°ãè¨å®ããã¦ãããããªããããUser
ãªãã¸ã§ã¯ãã®idã¨è¦ã¦åå¾ã試ã¿ãã- åå¾æåããã°ãããã
@current_user
ã«ä¿åãã¦ããã - ããã§ãªããã°ã
:false
ã@current_user
ã«è¨å®ãã¦ããã
- åå¾æåããã°ãããã
ãããã«ãããããã¾ã§ã§è¨å®ããã¦ãã
@current_user
ã®å¤ãè¿ãã
ããã§ã :false
ãªãã¦ããå¤ãªã·ã³ãã«ã使ã£ã¦ãæå³ãããããªãããã¼ãã¨ç§ã¨è«¸æ©ããã¯ã»ãã·ã§ã³ã§ã¶ã¡ã¶ã¡è¨ã£ã¦ããã©ãä»æ°ãã¤ããããã¡ãã¡ã§ @current_user ||=
ã¨ããã³ã¼ããå®è¡ããããã¨ã«ãªããããããã°ã¤ã³ç¶æ
æªç¥ãã¨ãéãã°ã¤ã³ç¶æ
ããåºå¥ããå¿
è¦ãããããã㧠@current_user
ã« nil
ã¨ã false
ãå
¥ãã¦ããã¨æ¬æ¥ã¯ãéãã°ã¤ã³ç¶æ
ãã§ãããã¨ã¯æ¢ç¥ã®çãªã®ã«ãæ¯åãã°ã¤ã³ã試ã¿ã¦å¤±æãããã¨ã«ãªãç¡é§ãªã¯ã¨ãªãèµ°ãã®ã ãããã§ããç¡å¹å¤ã§ãããã¨ãè¦ãç®ã«åãããããããã¤ãRubyã«ã¨ã£ã¦ã¯çã¨ãã¦è©ä¾¡ããããå¤ãå¿
è¦ãªãã ã
setterã®ã»ãã¯ãããã¯åã«æ¸ããããã« User
ãªãã¸ã§ã¯ãã¾ã㯠nil
ãè¨å®ããããã®ã¨æ³å®ãã¦ããã is_a? Symbol
ãã¦ãã¨ãããè¦ã㨠:false
ãåãä»ããã¿ããããã¾ãæåã¯ã
- æå¹å¤(
User
ãªãã¸ã§ã¯ã)ãä¸ãããããªãããã®idãã»ãã·ã§ã³å¤æ°ã«è¨å® - ç¡å¹å¤ãä¸ãããããªããã»ãã·ã§ã³å¤æ°ã«
nil
ãè¨å®
ã§ã @current_user
ã«ãå¤ãä¿åãã¦ãããã¨ã
ããã§get/setã§ãã @current_user
ãã©ãã§ä½¿ã£ã¦ããã¨ããã¨ã主㫠AuthenticatedSystem#logged_in?
ã§ä½¿ã£ã¦ãã
# Returns true or false if the user is logged in. # Preloads @current_user with the user model if they're logged in. def logged_in? current_user != :false end
ãã¼ãã·ã³ãã«ãããããã£ãè¦ã current_user
ã®å®ç¾©ã§ãå¿
ã User
ãªãã¸ã§ã¯ããã :false
ãè¿ãããã«ãªã£ã¦ãããã :false
ã¨æ¯è¼ããã ãã§ãã°ã¤ã³ãã¦ãããå¤å¥ã§ããã®ã ã
ã§ããã® logged_in?
ããã¡ãã¡ã§ä½¿ã£ã¦ã訳ãããããããã°ã¤ã³å¤å¥ã®ä»çµã¿ã§ãã£ãã
å¾å
- åå¿è åã(Scaffoldã®å )
- Componentã®æ¹åæ¡ãæ¢ã
- æRubyæ¸ç±ç¿»è¨³æ»èªä¼
æåã®ãã¤ã¯yuum3ããããã£ã¦ãã ãã£ãããã³ãºã»ãªã³å½¢å¼ã§ãscaffoldã¯åãã£ããã©ããã®å ä½ãåãããªãã¨ãã人ã®ããã®ã»ãã·ã§ã³ã
次ã®ã¯ã render_component
ãé
ãã¦ããªããªãã®ã§æ¹åæ¡ãèãããã¨ããã»ãã·ã§ã³ã
ç§ã¯ãèªåã§æã¡è¾¼ãã ææ¸ç±æ»èªä¼ã®ãªã¼ãã¼ã«ãªã£ããå 容ã¯ãªããããã¨ãããããã¿ããªã§æ¥½ããã ã¨ã ãè¨ã£ã¦ãããã
æ親ä¼
jig.jpã®äººã¨ãæ¥ã¦ããæºå¸¯ä¸ã®éçºã¯å¥ä¸çãªã®ã§èãã¦ã¦é¢ç½ããã¯ã©ã¹ãã¼ãã®ç¡ãJava!
ä¸å¤ªè©±
æ親ä¼ã§ã諸æ©ããç§å ããã¨ã話ããã
大ä½ãã®ãããã§è©±ãã¨ãã¤ãRailsã¢ããªã±ã¼ã·ã§ã³ã®ããã©ã¼ãã³ã¹ãã©ããã¦ããã¨ããããã話ã«ãªããç§å ããããcascaded eagar loadingã5段7段ã¨éããã¨ã¡ã¢ãªã¼ãå°ã£ã¦ããã足ãå¼ã£å¼µãããã§ãABDçã«ããã¨ã©ããã¦ããããªæãã®ã¯ã¨ãªãå¿ è¦ãã¨ãã話ããã¦ã¦ã諸æ©ããããã£ãã·ã¥ã®è©±ããã¦ã¦ã
ã§ãç§ãã¾ãé»æ³¢ãé£ã°ãå§ããããDBãµã¼ãã¼ã¨ã¢ããªã±ã¼ã·ã§ã³ãµã¼ãã¼ã®éã«ããï¼ã¤ãµã¼ãã¼ãç½®ãã°ãããããã¨ãã¾ããä¾ã«ãã£ã¦æãã¤ããã¼ã¹ã®ä¸å¤ªè©±ãªãã ãã©ã
ã¢ããªã±ã¼ã·ã§ã³ãã¸ãã¯ãDBãµã¼ãã¼ã«ä»»ããçºæ³ã¨ããã®ã¯ç§ã¯å¥½ãã§ãã ããç§ã¯ã¹ãã¢ãããã·ã¼ã¸ã£å¤§å¥½ããã ããã©ãããã§DBãµã¼ãã¼ã«è² è·ãå¢ããã®ã¯å¬ãããªããã ãããããRailsã¢ããªã±ã¼ã·ã§ã³ã®ä¸¦ååã§ã¯ã¢ããªã±ã¼ã·ã§ã³ã¯æ®ã©shared nothingãªãã ãã©ããã®åãDBã«éä¸ãããã ããããªããAPPã¨DBã®éã«ããä¸å±¤ããã¦ãããã§ã§ããã ããã£ãã·ã¥ãã¦ãããã§å¿ è¦ãªããªã¬ãå¼ãã¦ãããã«ãã¸ãã¹ãã¸ãã¯ãçãè¾¼ãã§ãAPPãµã¼ãã¼ã¯ãã®ãµã¼ãã¼ãåç §ããã°ãããããªããdRubyã§ã
ç¹ã«ãRailsãå¾æã¨ãããããªãä»ããCREATE TABLEãã¾ããã£ã¦ããéçºã§ã¯DBãåç §ãã¦ããæ¢åã®ã¢ããªã±ã¼ã·ã§ã³ã¨ããã®ã¯ç¡ãã¦ããããå ¨ã¦ãä½ãã®ã ããããã®ããæ¹ã§ç¡çããªãã
ã¨ãçºæ³ã¯åºã¦ãããã©ãèããã°èããã»ã©ãããããªãã¦è¨ãEJB?ããªãã ã
ã§ãããç§ã¯ä»å®éã«ããããå½¢ã§åããã¦ãããã£ãã·ã¥ãããã¼ã¿å¤æ´ã«å¯¾ããObserverãä¿æãããµã¼ãã¼ããã»ã¹ãmongrelã®è£ã«3ã¤ãããåãã¦ããä»ã®ã¨ããã¯ãã£ãã·ã¥ãç¡å¹åãããé »åº¦ã極ãã¦å°ãªãã®ã§æã§è£æ¹ãµã¼ãã¼ãåèµ·åãã¦ãã£ãã·ã¥ã¯ãªã¢ãã¦ããã©ããããçºå±ããã¦ãããæ´ç·´ãã¦ããã°ããã«ãã©ãçãã
çµå±ãEJBã¯æªããªããã ããã¸ãã¯ãåç¬ã®Webã¢ããªã±ã¼ã·ã§ã³ã«åã¾ããªãã¨ãããããã¯é 延ããã¦ããã¯ã°ã©ã¦ã³ãã§åããã¨ããããããã¨ãã«ãã¸ãã¯ãè£æ¹ãµã¼ãã¼ã§åããã¦ããã®ã¯æªããªãã
å ¨é¨ãå ¨é¨ãªã¢ã¼ãæ±ãããããã©ã¼ãã³ã¹ã«é¿ãããEJBã¯Localã¤ã³ã¿ã¼ãã§ã¼ã¹ãä½ã£ããã§ããçµå±ã¤ã³ã¿ã¼ãã§ã¼ã¹ãå®ç¾©ããæéã¯å¤ãã£ã¦ãªããEJB3ã«ãªã£ã¦POJOã«ãªã£ã¦ãHomeã¤ã³ã¿ã¼ãã§ã¼ã¹ãä½ããªãã¦æ¸ãããã«ãªã£ã¦ãã§ããã£ã±ãåæ£ãè¦éã«å ¥ããå®ç¾©ã¯å¿ è¦ã§ã
ããã¯ãåæ段éã§ã¯over killãªãã ãèªç¤¾ã§B2Cãµã¼ãã¹ãæä¾ãã¦åã¡æ®ã£ã¦ãããã¨ãããããªæã ãã¤ã³ã¿ã¼ãããæ¥çã®ä½äººã«ã¨ã£ã¦ã¯over killã ãæã ã«å¿ è¦ãªã®ã¯ãã¡æ©ãã¢ããªã±ã¼ã·ã§ã³ãåãã¯ããã¦ãã¨ã³ãã¦ã¼ã¶ã¼ã«è¦ã¦ãããããã¨ããã®ããã«ã¯Railsã¯è¯ãéå ·ã ãåæ£ãã©ãããã¨ããããããã®ã¯å¿ è¦ããªããããã®ããã®ããããªã³ã¹ããæããã
ããã¦ããµã¼ãã¹ãæé·ãã¦ãã£ãã¨ãããã®ã¨ãã«ãªã£ã¦èªç¶ãªå½¢ã§ãã¸ãã¯ãè£æ¹ã«å§è²ã§ããä»çµã¿ã欲ãããdRubyã«ã¯ãã®æ½å¨è½åããããç§ã¯Rubyã¯å¥½ãã§ãå人çã«ã¯ãã£ã¨ä½¿ã£ã¦ããã ãããã§ããä»äºã§Rubyã使ã£ã¦ããã®ã¯Railsã¨dRubyãããããã ãdRubyã®åã§ãã¢ãã«å±¤ã®å¾ãååããªã¢ã¼ãããã»ã¹ã«èªç¶ã«å¼ãã¯ããããããªãããããä»çµã¿ã欲ãããä½ããã¯ãã ããã¤ãä½ã£ã¦ããã
ã¨ãããããªãã¨ã話ããã