- Konu sahibi
- #1
İlk paragrafta ana yanıtı, izlenecek yolu ve ulaşılabilecek sonucu doğrudan ver. Ruby on Rails’te kullanıcı girişi ve kayıt sistemi için kullanıcı bilgilerini
Önce proje dizininde parola özetleme desteğini sağlayan
Ardından bağımlılığı yükle:
Kullanıcı modelini oluşturmak için şu komutu çalıştır:
Kullandığın Rails sürümünde
Bu işlemden sonra
Giriş yapan kullanıcıyı istekler arasında hatırlamak için Rails session mekanizmasını kullan. Rotalara kayıt, giriş ve çıkış işlemlerini ekle:
Kullanıcı kayıt denetleyicisini oluştur:
Başarılı girişte
Kayıt formunu
Giriş formu için
Bu form
Kullanıcıyı her istekte bulmak için ortak bir yardımcı metot tanımla:
Özel bir sayfayı korumak istediğinde ilgili denetleyicide
Oturumda kimlik bulunuyor ancak kullanıcı veritabanından silinmişse
Uygulamayı
Girişte doğru e-posta ve parola ana sayfaya yönlendirmeli, yanlış bilgiler ise yeni giriş formunu göstermelidir. Çıkış isteği
Üretim ortamında parolaları, oturum çerezlerini ve CSRF korumasını devre dışı bırakma. E-posta doğrulama, parola sıfırlama, hız sınırlama, çok faktörlü kimlik doğrulama veya OAuth gibi ihtiyaçlar varsa bu temel yapı tek başına onları sağlamaz; bu özellikleri ayrıca tasarlamak ya da bakımı yapılan bir kimlik doğrulama çözümü kullanmak gerekir.
users tablosunda tutup parolayı düz metin olarak saklamamalısın. has_secure_password ile parola özeti oluşturabilir, kayıt sırasında doğrulama yapabilir, başarılı girişte kullanıcı kimliğini oturumda saklayabilir ve çıkışta bu oturumu silebilirsin. Aşağıdaki örnek, Rails uygulamasında temel kayıt, giriş, çıkış ve korumalı sayfa akışını oluşturur.Kullanıcı modelini ve parola güvenliğini oluşturma
Önce proje dizininde parola özetleme desteğini sağlayan
bcrypt gem’inin bulunduğundan emin ol. Gemfile’da yoksa ekle:
Ruby:
gem "bcrypt", "~> 3.1"
Ardından bağımlılığı yükle:
Bash:
bundle install
Kullanıcı modelini oluşturmak için şu komutu çalıştır:
Bash:
bin/rails generate model User name:string email:string password:digest
password:digest, model için password_digest alanını oluşturur. Bu alan parolanın kendisini değil, doğrulama için kullanılan özetini saklar. Büyük ve küçük harf sorunlarını azaltmak için e-posta adresini model düzeyinde benzersiz ve küçük harfe dönüştürülmüş olarak tutmak gerekir.
Ruby:
# app/models/user.rb
class User < ApplicationRecord
has_secure_password
normalizes :email, with: ->(email) { email.strip.downcase }
validates :email, presence: true, uniqueness: true
end
Kullandığın Rails sürümünde
normalizes desteklenmiyorsa bu satırı kaldırıp e-posta adresini kayıt işleminden önce strip.downcase ile düzenleyebilirsin. Model oluşturulduktan sonra veritabanı değişikliğini uygula:
Bash:
bin/rails db:migrate
Bu işlemden sonra
User.create(name: "Ali", email: "[email protected]", password: "guclu-bir-parola") çağrısı kullanıcı kaydı oluşturur. password ve password_confirmation değerleri uyuşmuyorsa veya parola doğrulamadan geçmezse kayıt başarısız olur. Parola daha sonra password_digest alanından geri alınamaz; bu nedenle girişte parola özeti karşılaştırılarak doğrulanır.Oturum işlemlerini kurma
Giriş yapan kullanıcıyı istekler arasında hatırlamak için Rails session mekanizmasını kullan. Rotalara kayıt, giriş ve çıkış işlemlerini ekle:
Ruby:
# config/routes.rb
Rails.application.routes.draw do
root "home#index"
get "/signup", to: "users#new"
post "/signup", to: "users#create"
get "/login", to: "sessions#new"
post "/login", to: "sessions#create"
delete "/logout", to: "sessions#destroy"
end
Kullanıcı kayıt denetleyicisini oluştur:
Ruby:
# app/controllers/users_controller.rb
class UsersController < ApplicationController
def new
@user = User.new
end
def create
@user = User.new(user_params)
if @user.save
session[:user_id] = @user.id
redirect_to root_path, notice: "Hesabınız oluşturuldu."
else
render :new, status: :unprocessable_entity
end
end
private
def user_params
params.require(:user).permit(:name, :email, :password, :password_confirmation)
end
end
permit çağrısı yalnızca beklenen alanların modele aktarılmasını sağlar. Formda parola alanlarının isimleri user[password] ve user[password_confirmation] olmalıdır; aksi durumda güçlü parametreler bu değerleri kabul etmez.Giriş ve çıkış denetleyicisini yazma
authenticate_by desteklenmeyen Rails sürümlerinde find_by ve authenticate yöntemlerini kullanabilirsin:
Ruby:
# app/controllers/sessions_controller.rb
class SessionsController < ApplicationController
def new
end
def create
@user = User.find_by(email: params[:email].to_s.strip.downcase)
if @user&.authenticate(params[:password])
reset_session
session[:user_id] = @user.id
redirect_to root_path, notice: "Giriş yapıldı."
else
flash.now[:alert] = "E-posta veya parola hatalı."
render :new, status: :unprocessable_entity
end
end
def destroy
reset_session
redirect_to login_path, notice: "Oturum kapatıldı."
end
end
Başarılı girişte
session[:user_id] atanır. reset_session çağrısı, giriş öncesindeki oturum kimliğini yenilediği için oturum sabitleme riskini azaltır. Başarısız girişte aynı genel hata mesajını kullanmak, e-posta adresinin sistemde kayıtlı olup olmadığını dışarıya açıklamaz.Kayıt ve giriş formlarını ekleme
Kayıt formunu
app/views/users/new.html.erb dosyasına koy:
Kod:
<h1>Kayıt ol</h1>
<%= form_with model: @user, url: signup_path do |form| %>
<%= form.label :name, "Ad" %>
<%= form.text_field :name %>
<%= form.label :email, "E-posta" %>
<%= form.email_field :email %>
<%= form.label :password, "Parola" %>
<%= form.password_field :password %>
<%= form.label :password_confirmation, "Parola tekrarı" %>
<%= form.password_field :password_confirmation %>
<%= form.submit "Kayıt ol" %>
<% end %>
<%= render "shared/errors", object: @user %>
Giriş formu için
app/views/sessions/new.html.erb dosyasını oluştur:
Kod:
<h1>Giriş yap</h1>
<%= form_with url: login_path, scope: nil do |form| %>
<%= form.label :email, "E-posta" %>
<%= form.email_field :email %>
<%= form.label :password, "Parola" %>
<%= form.password_field :password %>
<%= form.submit "Giriş yap" %>
<% end %>
Bu form
email ve password parametrelerini doğrudan gönderir. Denetleyicideki params[:email] ve params[:password] kullanımı bu yapıyla uyumludur. Rails’in form yardımcıları CSRF koruması için gerekli belirteci otomatik ekler; formu elle HTML olarak yazarsan bu korumayı ayrıca sağlaman gerekir.Giriş yapılmış kullanıcıyı tanımlama ve sayfa koruma
Kullanıcıyı her istekte bulmak için ortak bir yardımcı metot tanımla:
Ruby:
# app/controllers/application_controller.rb
class ApplicationController < ActionController::Base
helper_method :current_user
private
def current_user
@current_user ||= User.find_by(id: session[:user_id]) if session[:user_id]
end
def require_login
return if current_user
redirect_to login_path, alert: "Bu sayfayı görmek için giriş yapmalısınız."
end
end
Özel bir sayfayı korumak istediğinde ilgili denetleyicide
before_action :require_login kullan:
Ruby:
class DashboardController < ApplicationController
before_action :require_login
def index
end
end
Oturumda kimlik bulunuyor ancak kullanıcı veritabanından silinmişse
current_user değeri nil olur ve kullanıcı giriş yapmamış kabul edilir. Bu durum, yalnızca session’da bir kimlik bulunmasının hesabın hâlâ geçerli olduğunu kanıtlamadığını gösterir.Sonucu kontrol etme ve yaygın hatalar
Uygulamayı
bin/rails server ile çalıştırıp önce /signup adresinden yeni bir hesap oluştur. Başarılı kayıttan sonra ana sayfaya yönlendirilmen ve session[:user_id] değerinin atanması gerekir. Aynı e-posta ile ikinci kez kayıt denersen model doğrulaması başarısız olur; form yeniden gösterilir ve hata mesajı görüntülenir.Girişte doğru e-posta ve parola ana sayfaya yönlendirmeli, yanlış bilgiler ise yeni giriş formunu göstermelidir. Çıkış isteği
DELETE /logout olarak gönderilmelidir. Çıkıştan sonra korumalı bir sayfaya gidildiğinde /login adresine yönlendirme görmüyorsan ilgili denetleyicide before_action :require_login bulunup bulunmadığını ve oturum çerezlerinin tarayıcıda etkin olduğunu kontrol et.Üretim ortamında parolaları, oturum çerezlerini ve CSRF korumasını devre dışı bırakma. E-posta doğrulama, parola sıfırlama, hız sınırlama, çok faktörlü kimlik doğrulama veya OAuth gibi ihtiyaçlar varsa bu temel yapı tek başına onları sağlamaz; bu özellikleri ayrıca tasarlamak ya da bakımı yapılan bir kimlik doğrulama çözümü kullanmak gerekir.