web-dev-qa-db-fra.com

Vérifier si l'utilisateur s'est connecté avant toute action dans Rails

Je veux exécuter une fonction avant toute action du contrôleur pour vérifier si l'utilisateur est connecté. J'utilise le système pour pouvoir utiliser is_signed_in ?, mais je dois indiquer la condition contraire pour chaque méthode du contrôleur.

Ce que je veux, c'est avoir quelque chose comme ça:

   #some_controller.rb
before_action :is_signed_in?

def is_signed_in?
   if !user_signed_in?
      redirect_to new_user_session_path
   else 
      ..proceed to the action intended to call
   end
end
Pour que cette méthode soit exécutée avant toute action (ou un ensemble d'actions) et redirigée pour vous connecter si faux, ou que cette action soit exécutée si vrai.

8
yerassyl

Devise est livré avec quelques helpers intégrés utiles.

Dans votre cas, celui qui vous a intéressé est authenticate_user!. Jetez un coup d'œil à filtres de contrôleur et aides dans la documentation de Devise.

Vous pouvez filtrer vos actions dans votre contrôleur avec cette méthode pour vous assurer que seuls les utilisateurs connectés peuvent traiter une action donnée ou toutes les actions d'un contrôleur. Sinon, si l'utilisateur n'est pas connecté, il est redirigé vers la page de connexion.

before_action :authenticate_user!

before_action :authenticate_user!, only: [:show]
17
Florent Ferry

Vous pouvez également créer votre propre méthode d'assistance.

Dans votre users_controller.rb, créez un filtre before_action

class UsersController < ApplicationController
    before_action :logged_in_user
    ...
end

et dans votre session_helper.rb

module SessionHelper
   # Returns true if the user is logged in, false otherwise.
   def logged_in?
       !current_user.nil?
   end

   # Confirms a logged-in user.
   def logged_in_user
      unless logged_in?
         flash[:danger] = "Please log in."
         redirect_to login_url
      end
   end

end
9
Archie Reyes

Si vous voulez vérifier si l'utilisateur est signé pour chaque action de l'application, vous devez placer le filtre dans le contrôleur d'application. Vous pouvez également le faire pour un contrôleur spécifique.

Vous pouvez utiliser la méthode devise:

class SomeController < ApplicationController
  before_action :authenticate_user!
  ...
end

Vous pouvez également créer votre propre filtre:

class SomeController < ApplicationController
  before_action :my_authentication
  ... 
  def my_authentication
     if user_signed_in? 
        # do something ...
     else 
        # do something else ...
     end
  end
end
2
webster

Utilisez-vous concevez ? Vous pouvez utiliser le filtre existant:

  class SomeController < ApplicationController
    before_filter :authenticate_user!
    ...
  end

sinon, créez votre filtre dans le contrôleur d'application et ajoutez-le à vos contrôleurs nécessaires:

  class SomeController < ApplicationController
    before_filter :my_auth_filter
    ...
  end
1
rmagnum2002

Vous pouvez ajouter cette méthode à votre ApplicationController.

def user_is_logged_in
    if !session[:current_user]
        redirect_to login_path
    end
end

Utilisez-le avant d'appeler des actions. Ainsi,

class AdminsController < ApplicationController
  before_action :user_is_logged_in
  ...
end
0
Kent Aguilar