Rails 8 Authenticatie: De Ingebouwde Generator Die Devise Vervangt
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:
Usermodel methas_secure_passworden email-normalisatieSessionmodel dat actieve sessies per gebruiker bijhoudtSessionsControllervoor inloggen en uitloggenPasswordsControllervoor reset-aanvragenAuthenticationconcern die je include inApplicationController- 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:
- Genereer de authenticatie-bestanden
- Behoud je bestaande
userstabel — zorg datpassword_digestbestaat (Devise gebruiktencrypted_password, dus je hebt een migratie nodig) - Gebruikers moeten hun wachtwoord resetten — Devise’s bcrypt-formaat is compatibel met
has_secure_password, maar de kolomnaam verschilt - Vervang
authenticate_user!doorrequire_authenticationin je controllers - Wissel
current_userreferenties om naarCurrent.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.
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 TouchRelated Articles
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