さて、前回の記事では、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
おお。見事に入力されていますね。暗号化も完璧です。
さて、次回はログインの仕組みを作成していきましょう。
この記事がお役にたちましたらシェアをお願いします