さて、前回の記事では、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 件のコメント:
コメントを投稿