R.Reddington

WFN Üye
Konular
562
Mesajlar
562
Çözüm
0
Ticaret Puanı
0
Üyelik
24 Gün
Konum
Kastamonu
Web Sitesi
Var
Alanı
Sosyal Backlink
1/1
Konu sahibi
İ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 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.
 

Sende şimdi bize katılmak ister misin?

Kayıt ol

Bize katılım kolay ve ücretsizdir!

Foruma git ?

Bu konuyu görüntüleyen kullanıcılar

Bu konuyu şu anda görüntüleyen üye bulunmuyor.
Robotlar:
  • Anthropic