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
Ruby on Rails Developer

Ben Aşkın, Protel Teknoloji Çözümlerinde yazılım geliştirme takım lideri olarak çalışıyorum.

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