07 Jul 2013

Rails 4 ile kimlik doğrulama işlemleri nasıl yapılıyor bu yazıda onu anlatacağım.

İlk adım olarak Gemfile içine parolaları şifrelemek için gerekli bcrypt-ruby gem’ini ekliyoruz. Ardından bundle install ile gemi kuruyoruz.

email ve password_digest alanları olan bir User modeli üretelim. password_digest şifrelenmiş parolanın tutulacağı alan.

$ rails generate model User email:string password_digest:string

Daha sonra veritabanında tablomuzu oluşturalım.

$ rake db:migrate

User modelimize has_secure_password satırını ekliyoruz. Bu sayede password ve password_confirmation şeklinde iki tane sanal özelliğimiz olacak. Bu özellikler veritabanında tutulmamakta.

# app/model/user.rb
class User < ActiveRecord::Base
  has_secure_password

  validates :password, length: { minimum: 6 }
end

Bu arada bu sanal özelliklere yukarıdaki gibi doğrulamalar(validates) eklemek mümkün. Parola için presence kontrolü has_secure_password ile gelir, eklemenize gerek yoktur.

 $ rails console

Test edelim.

pry(main)> User
=> User(id: integer, email: string, password_digest: string, created_at: datetime, updated_at: datetime)
pry(main)> u = User.new
=> #<User id: nil, email: nil, password_digest: nil, created_at: nil, updated_at: nil>

Görüldüğü gibi User tablomuzda password ve password_confirmation yok.

pry(main)> u.password = 123123
=> 123123
pry(main)> u.password_confirmation = 123123
=> 123123

Fakat atama yapabiliyorum. Eğer has_secure_password modelimizden silinirse atama yapılırken hata verecektir. Password ve password_confirmation alanları yok olacaktır. Deneyerek görmenizde fayda var.

pry(main)> u.save
=> true
pry(main)> u.password_digest
=> "$2a$10$oS6bKhpkG9IMo5F1QMPTNe4esVwKRAj2FBveEbDG/M/vCF99nmtcW"

Parolayı boş veya eşlenmeyen şekilde girmeyi deneyelim.

pry(main)> u = User.create(password:"", password_confirmation:"")
=> #<User id: nil, email: nil, password_digest: "", created_at: nil, updated_at: nil>
pry(main)> u.errors.full_messages
=> ["Password can't be blank", "Password is too short (minimum is 6 characters)"]

pry(main)> u = User.create(password: "123123", password_confirmation: "123345")
=> #<User id: nil, email: nil, password_digest: "$2a$10$j.CAyJMyIR4lBFn8bJrMDOSvP/XMXcFgTZQvPfQnXUC5...", created_at: nil, updated_at: nil>
pry(main)> u.errors.full_messages
=> ["Password confirmation doesn't match Password"]

pry(main)> u = User.create(password: "213", password_confirmation: "")
=> #<User id: nil, email: nil, password_digest: "$2a$10$NZUe5Ad3TC1a.6vT6XLYe.AHEEfvrjn4q3KZn.lfL0Gq...", created_at: nil, updated_at: nil>
pry(main)> u.errors.full_messages
=> ["Password confirmation doesn't match Password",
"Password confirmation can't be blank",
"Password is too short (minimum is 6 characters)"]

Authenticate işlemi

email: 'askn@bil.omu.edu.tr'
parola: 123123

olan bir kullanıcı oluşturalım ve kimlik doğrulaması yapalım.

pry(main)> User.create(email: "askn@bil.omu.edu.tr", password: 123123, password_confirmation:123123)
=> #<User id: 3, email: "askn@bil.omu.edu.tr", password_digest: "$2a$10$QLFKbd35ON0DRKn6TmxGIOKiJ9ELyvOIhnaE05CZJExT...", created_at: "2013-07-07 13:47:15", updated_at: "2013-07-07 13:47:15">

authenticate işlemi de has_secure_password ile gelmektedir.

pry(main)> u = User.find_by(email: "askn@bil.omu.edu.tr")
=> #<User id: 3, email: "askn@bil.omu.edu.tr", password_digest: "$2a$10$QLFKbd35ON0DRKn6TmxGIOKiJ9ELyvOIhnaE05CZJExT...", created_at: "2013-07-07 13:47:15", updated_at: "2013-07-07 13:47:15">

pry(main)> u.authenticate(123123)
=> #<User id: 3, email: "askn@bil.omu.edu.tr", password_digest: "$2a$10$QLFKbd35ON0DRKn6TmxGIOKiJ9ELyvOIhnaE05CZJExT...", created_at: "2013-07-07 13:47:15", updated_at: "2013-07-07 13:47:15">

pry(main)> u.authenticate(12312)
=> false

Kimlik doğrulama işlemi için gerekli User modelimizi oluşturmayı bu yazımda öğrendik.

Not: Like atalım, attıralım :-P.

Kaynaklar

Aşkın Gedik
Software Engineer

Ben Aşkın,

Benimle ilgili daha fazla bilgiyi hakkımda sayfasına göz atarak veya Twitter, Facebook ve Github üzerinden takip ederek öğrenebilirsiniz.