2012年4月11日水曜日

Ruby on Rails3でdeviseを使う前準備その1ユーザー登録

さて、前回の記事では、diviseを使う前に、railsで認証の仕組みを一度スクラッチから組むべきだというReadMeの内容を紹介しました。
そんなわけで今回は、railsで認証の仕組みをスクラッチから作成していこうと思います。
環境はruby-1.9.3-p0, rails3.2.2, sqlite3です。
この記事の対象者は、railsのド基礎を理解している人です。つまり、controllerでviewからのパラメーターを取得して、DBにデータを格納する流れがわかるレベルでOKです。中級者と上級者は帰ってください。僕が恥ずかしいからw

しかし、本当に覚えること多すぎじゃね、Rails。javaのEJBより敷居高いかも。

というわけでLet's start!!

プロジェクトの作成


rails new auth 

コントローラーの作成


cd auth // プロジェクトフォルダへ移動

rails generate controller users new

users_controllerとusers/view/new.html.erbのviewを作成します。

テーブルモデルの作成


rails generate model user email:string password_hash:string password_salt:string

emailはメールアドレスです。password_hashはパスワードハッシュのことです。意味はこういうこと。
password_saltはパスワードハッシュ値を作成する時に、パスワード文字列と共に用いられる任意の文字列のことです
なに言っているかわかね〜って人は認証のシステムを作る前に、セキュリティの勉強からはじめてください。

テーブルの作成


rake db:migrate

テーブルが作成されます。これで準備OK。続いて、コードを記述していきます。

UsersControllerを記述

# coding : utf-8
class UsersController < ApplicationController
  def new
    @user = User.new
  end
  
  def create
     @user = User.new(params[:user])
     if @user.save
      redirect_to root_url, :notice => "signed up!"
     else
       render "new"
     end
  end
end

createメソッドは、userのパラメーターを取得してDBの保存に成功したら、root_urlへ遷移し、メッセージを表示します。失敗した場合は、エラーメッセージと共にnew.html.erbを再表示します。

new.html.erbを変更

<h1>Sign Up</h1>
<%= form_for @user do |f| %>
 
 <!-- error msg -->
 <% if @user.errors.any? %>
   <ul>
     <% @user.errors.full_messages.each do |msg| %>
     <li><%= msg %></li>
     <% end %>
   </ul>
 <% end %>
 
 <!-- display field -->
 <p>
   <%= f.label :email %><br/>
   <%= f.text_field :email %>
 </p>
 <p>
   <%= f.label :password %><br/>
   <%= f.password_field :password %>
 </p>
 <p>
   <%= f.label :password_comfirmation %><br/>
   <%= f.text_field :password_comfirmation %>
 </p>
 <p><%= f.submit %></p>
<% end %>

viewを作成。emailとパスワード、パスワードの確認を表示します。保存失敗の場合のエラーメッセージも表示します。

ルーティングの設定


  get "sign_up" => "users#new", :as => "sign_up"
  root :to => "users#new"
  resources :users
  

getはHTTPメソッドです。=>は:controllerと:actionの短縮生です。:asはルート名です。詳しい説明はここが理解しやすいです。

設定ができているかをrake routesコマンドで確認します。


  sign_up GET    /sign_up(.:format)        users#new
     root        /                         users#new
    users GET    /users(.:format)          users#index
          POST   /users(.:format)          users#create
 new_user GET    /users/new(.:format)      users#new
edit_user GET    /users/:id/edit(.:format) users#edit
     user GET    /users/:id(.:format)      users#show
          PUT    /users/:id(.:format)      users#update
          DELETE /users/:id(.:format)      users#destroy
  

はい準備OKです。続いてUserクラスを修正します。

Userクラス

必要なのは、パスワードのアクセサー、バリデーションの処理です。


  attr_accessor :password, :password_comfirmation
  
  validates email,
    :presence => true,
    :uniqueness => true
  validates password,
    :presence => true,
    :length => {:minimun => 7, maximum => 15}
  

メールは一意で入力必須。パスワードは、入力必須で7-15文字制限にします。

続いてパスワードの暗号化を行います。暗号化にはbcrypt-rubyを使います。Gemfileに記述してライブラリを利用できるようにします。


  vi Gemfile
  
  gem "bcrypt-ruby", :require => "bcrypt"

暗号化処理

続いて、暗号化処理を実装します。パスワードの暗号化はvalidationのチェックの終了後、つまりテーブルに保存する前におこないます。


  attr_accessor :password, :password_comfirmation
  before_save :encrypt_password
  
  validates email,
    :presence => true,
    :uniqueness => true
  validates password,
    :presence => true,
    :length => {:minimun => 7, maximum => 15}
  

暗号化処理を実装します。


  attr_accessor :password, :password_comfirmation
  before_save :encrypt_password
  
  validates :email,
    :presence => true,
    :uniqueness => true
  validates :password,
    :presence => true,
    :length => {:minimun => 7, :maximum => 15}

  def encrypt_password
    if password.present?
      self.password_salt = BCrypt::Engine.generate_salt
      self.password_hash = BCrypt::Engine.hash_secret(password, password_salt)
    end
  end
 

bcrypt-rubyの処理内容はここで確認できます。

さて、ここまでできたら、サーバーを起動して、http://localhost:3000/sign_upにアクセスしましょう。
ミスがなければ画面が表示されるはずです。入力チェックと、正常入力を試してみてください。
正常入力がうまくいったら、dbを確認してみましょう。

1|test@test.co.jp|$2a$10$BLJBZXyvzecoZJeiZrMYhOuZbRQJQDyESfMjrcwkofvB2UGGBvdPK|$2a$10$BLJBZXyvzecoZJeiZrMYhO|2012-04-11 06:29:23.361652|2012-04-11 06:29:23.361652

おお。見事に入力されていますね。暗号化も完璧です。

さて、次回はログインの仕組みを作成していきましょう。

この記事がお役にたちましたらシェアをお願いします

このエントリーをはてなブックマークに追加

0 件のコメント:

コメントを投稿

Related Posts Plugin for WordPress, Blogger...