J'utilise Devise avec Ruby on Rails.
Quelle est la méthode recommandée pour rediriger les utilisateurs non authentifiés vers la nouvelle page des sessions s'ils tentent d'accéder à une page nécessitant une authentification?
À l'heure actuelle, j'obtiens une erreur indiquant qu'aucun itinéraire ne correspond à celui auquel ils tentent d'accéder (ce qui entraîne une erreur 404 en production).
Ajoutez simplement cette méthode à application_controller.rb
protected
def authenticate_user!
if user_signed_in?
super
else
redirect_to login_path, :notice => 'if you want to add a notice'
## if you want render 404 page
## render :file => File.join(Rails.root, 'public/404'), :formats => [:html], :status => 404, :layout => false
end
end
Et vous pouvez appeler cette méthode sur before_filter
un autre contrôleur que vous voulez.
par exemple :
class HomesController < ApplicationController
before_filter :authenticate_user!
## if you want spesific action for require authentication
## before_filter :authenticate_user!, :only => [:action1, :action2]
end
N'oubliez pas d'ajouter login_path
en routes.rb
devise_scope :user do
match '/sign-in' => "devise/sessions#new", :as => :login
end
remarque: J'utilise toujours cette méthode lorsque je joue avec des appareils pour l'authentification de mes applications. (Rails 3.2 et Rails 4.0.1)
Vous pouvez faire comme GeekTol l'a écrit, ou simplement mettre
before_action :authenticate_user!
dans votre contrôleur.
Dans ce cas, devise utilise l'utilisateur authenticate_user par défaut! , qui redirigera vers le "chemin_session_utilisateur" et utilisera le message flash par défaut.
Il n'est pas nécessaire de réécrire authenticate_user! , sauf si vous souhaitez la personnaliser.
Je pensais que vous pourriez simplement ajouter: before_action: authenticate_user! à chaque contrôleur qui nécessitait que l'utilisateur soit connecté.
Je suis un Rails débutant mais j'ai trouvé cela dans mes propres recherches et cela fonctionne bien dans mon application.
Vous devriez vous référer à la façon de faire de Devise: Comment: rediriger vers une page spécifique lorsque l'utilisateur ne peut pas être authentifié .
Une autre alternative à laquelle je peux penser est de créer une contrainte de routage enveloppant vos routes protégées. Vous feriez mieux de suivre la voie de Devise, mais voici un exemple:
#On your routes.rb
constraints(Constraints::LoginRequired) do
get '/example'
end
#Somewhere like lib/constraints/login_required.rb
module Constraints
class LoginRequired
def self.matches?(request)
#some devise code that checks if the user is logged in
end
end
end