35+ Years Experience Netherlands Based ⚡ Fast Response Times Ruby on Rails Experts AI-Powered Development Fixed Pricing Available Senior Architects Dutch & English 35+ Years Experience Netherlands Based ⚡ Fast Response Times Ruby on Rails Experts AI-Powered Development Fixed Pricing Available Senior Architects Dutch & English
Rails 8 Authenticatie: De Ingebouwde Generator Die Devise Vervangt

Rails 8 Authenticatie: De Ingebouwde Generator Die Devise Vervangt

TTB Software
rails
Hoe je authenticatie opzet in Rails 8 met de nieuwe ingebouwde generator. Stap-voor-stap handleiding voor sessies, wachtwoord resets, en wanneer je nog Devise nodig hebt.

Rails 8 wordt geleverd met bin/rails generate authentication, een ingebouwde authenticatie-generator die sessie-gebaseerde auth creëert zonder externe gems. Als je bij elk nieuw project naar Devise greep, verandert dit de afweging.

De generator produceert een User model, een Session model, in- en uitlog-controllers, een wachtwoord-reset flow, en de Current object-koppeling — alles in zo’n 200 regels code die volledig van jou zijn.

De Generator Draaien

rails new myapp
cd myapp
bin/rails generate authentication
bin/rails db:migrate

Dat is alles. Je hebt nu:

  • User model met has_secure_password en email-normalisatie
  • Session model dat actieve sessies per gebruiker bijhoudt
  • SessionsController voor inloggen en uitloggen
  • PasswordsController voor reset-aanvragen
  • Authentication concern die je include in ApplicationController
  • Rate limiting op inlogpogingen via rate_limit

Wat De Gegenereerde Code Doet

De Authentication concern is de kern. Het biedt require_authentication als before action en maakt Current.user beschikbaar in je hele applicatie:

# app/controllers/concerns/authentication.rb
module Authentication
  extend ActiveSupport::Concern

  included do
    before_action :require_authentication
  end

  private

  def require_authentication
    resume_session || request_authentication
  end

  def resume_session
    if session_record = find_session_by_cookie
      set_current_session(session_record)
    end
  end

  def find_session_by_cookie
    Session.find_by(id: cookies.signed[:session_id])
  end

  def request_authentication
    redirect_to new_session_path
  end

  def set_current_session(session_record)
    Current.session = session_record
  end
end

Geen magie. Geen 50-modules-diepe stack trace als er iets misgaat. Je kunt de hele auth-flow in vijf minuten doorlezen.

Sessiebeheer

Elke login creëert een Session record gekoppeld aan de gebruiker. Het sessie-token wordt opgeslagen in een signed cookie. Dit betekent dat je actieve sessies kunt tonen, specifieke sessies kunt intrekken, en logingeschiedenis kunt bijhouden — functies die met Devise custom werk vereisten.

class SessionsController < ApplicationController
  allow_unauthenticated_access only: [:new, :create]
  rate_limit to: 10, within: 3.minutes, only: :create

  def create
    if user = User.authenticate_by(
      email: params[:email],
      password: params[:password]
    )
      start_new_session_for(user)
      redirect_to root_path
    else
      redirect_to new_session_path,
        alert: "Ongeldig e-mailadres of wachtwoord."
    end
  end

  def destroy
    terminate_session
    redirect_to new_session_path
  end
end

De rate_limit macro is nieuw in Rails 8. Het gebruikt standaard het IP-adres van het verzoek en retourneert HTTP 429 bij overschrijding. Geen Rack::Attack configuratie nodig voor basis login-throttling.

Wachtwoord Resets

De generator creëert een token-gebaseerde wachtwoord-reset flow met generates_token_for:

class User < ApplicationRecord
  has_secure_password

  generates_token_for :password_reset, expires_in: 15.minutes do
    password_salt&.last(10)
  end

  normalizes :email, with: ->(email) { email.strip.downcase }
end

generates_token_for is toegevoegd in Rails 7.1. Het token wordt automatisch ongeldig wanneer het wachtwoord wijzigt (omdat password_salt verandert), en het verloopt na 15 minuten. Geen aparte token-kolom in de database. Geen opschoon-cron-jobs.

Wanneer Je Nog Devise Nodig Hebt

De ingebouwde generator dekt het 80%-scenario. Je wilt Devise (of een andere gem) wanneer je nodig hebt:

  • OAuth/OmniAuth integratie — social logins vereisen meer werk dan de generator biedt
  • E-mailbevestiging — de generator heeft geen e-mailverificatie-flow
  • Account-vergrendeling — naast rate limiting, als je accounts wilt blokkeren na N mislukte pogingen
  • Complexe rol-gebaseerde toegang — Devise + Pundit/CanCanCan is een beproefde stack

Voor API-only apps moet je de cookie-gebaseerde sessies omruilen voor token-auth. Het sessiemodel van de generator geeft je een goede basis, maar je moet zelf token-generatie en header-gebaseerde authenticatie toevoegen.

Migratie Vanaf Devise

Als je een bestaande Devise-app overzet naar ingebouwde auth:

  1. Genereer de authenticatie-bestanden
  2. Behoud je bestaande users tabel — zorg dat password_digest bestaat (Devise gebruikt encrypted_password, dus je hebt een migratie nodig)
  3. Gebruikers moeten hun wachtwoord resetten — Devise’s bcrypt-formaat is compatibel met has_secure_password, maar de kolomnaam verschilt
  4. Vervang authenticate_user! door require_authentication in je controllers
  5. Wissel current_user referenties om naar Current.user

Dit is een geleidelijk proces. Draai beide systemen parallel tijdens de migratie. Ik heb deze migratie gedaan op een Rails-app met multi-tenancy en het kostte ongeveer twee dagen voor een middelgrote codebase.

Veelgestelde Vragen

Werkt Rails 8 authenticatie met API-only applicaties?

Niet direct. De generator creëert cookie-gebaseerde sessie-auth ontworpen voor server-rendered apps. Voor API’s moet je de Authentication concern aanpassen om tokens uit de Authorization header te lezen in plaats van cookies. Het Session model werkt nog steeds — genereer een token bij aanmaak en authenticeer via header in plaats van signed cookie.

Kan ik de Rails 8 auth-generator gebruiken met een bestaand User model?

Ja. De generator controleert op een bestaand User model en slaat het aanmaken van een nieuw model over. Het voegt has_secure_password en email-normalisatie toe als die ontbreken. Draai bin/rails generate authentication en bekijk de gegenereerde migratie — het voegt alleen kolommen toe die nog niet bestaan.

Hoe verhoudt de ingebouwde rate limiting zich tot Rack::Attack?

De rate_limit macro gebruikt Rails’ ingebouwde cache store (meestal Redis of Memcached in productie) en beperkt op IP-adres. Rack::Attack biedt meer flexibiliteit — throttling per gebruiker, custom discriminators, blocklists en safelists. Voor login-throttling is de ingebouwde aanpak voldoende. Voor uitgebreide API rate limiting over meerdere endpoints blijft Rack::Attack het betere gereedschap.

Is de gegenereerde authenticatiecode veilig genoeg voor productie?

Ja. Het gebruikt has_secure_password (bcrypt), signed cookies, constant-time token vergelijking, rate limiting, en voorkomt user enumeration bij wachtwoord-resets. Dit zijn dezelfde primitieven die Devise intern gebruikt. De belangrijkste beveiligingstoevoeging die je moet doen is HTTPS afdwingen (wat Rails 8 standaard doet in productie) en CSRF-bescherming (ook standaard). Voor zero-downtime deployments is de sessietabel-migratie eenvoudig.

Moet ik de gegenereerde code verwijderen en zelf schrijven?

Nee. De gegenereerde code is bedoeld om aangepast te worden, niet vervangen. Zie het als een goed getest startpunt. Lees het door, begrijp het, pas het dan aan. Het hele punt is dat jij de code bezit — anders dan bij Devise, waar aanpassing betekent dat je gems monkey-patcht of controllers decoreert via een diep geneste overerving.

T

About the Author

Roger Heykoop is een senior Ruby on Rails ontwikkelaar met 19+ jaar Rails ervaring en 35+ jaar ervaring in softwareontwikkeling. Hij is gespecialiseerd in Rails modernisering, performance optimalisatie, en AI-ondersteunde ontwikkeling.

Get in Touch

Share this article

Need Expert Rails Development?

Let's discuss how we can help you build or modernize your Rails application with 19+ years of expertise

Schedule a Free Consultation