web-dev-qa-db-fra.com

Rediriger vers la page de connexion si l'utilisateur n'est pas authentifié avec Devise

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).

25
Gdeglin

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)

63
GeekToL

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.

20
leandrotk

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.

3
comphelp

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
1
Lucas Polonio