Devise, comportement très étrange


#1

Bonjour à tous,

J’ai un souci de customisation de mon SessionsController avec Devise. L’app ayant une partie API et une partie web, voici mon fichier routes.rb :

devise_for :users, :controllers => {:sessions => 'websessions'}
resource :dashboard

root :to => "dashboard#index"

namespace :api, defaults: {format: 'json'} do
devise_for :users, :controllers => {:sessions => "api/apisessions"}
end

Ca, ça marche.

J’ai en revanche un souci avec mon websessions_controller. Je dois vérifier que le booléen FlgEnbl est à true dans ma base (ça précise que l’utilisateur est actif)

Voici mon code :


def create
resource = User.find_for_database_authentication(:email => params[:user][:email])
return failure unless resource

  if resource.valid_password?(params[:user][:password])

    logger.info 'Flag value' => resource.FlgEnbl

    if resource.FlgEnbl == true

        sign_in('user', resource)
        redirect_to root_url

    else 
        return failure
    end
  else
    return failure
  end
end

protected

def failure
warden.custom_failure!
  return redirect_to new_user_session_path, alert: 'Invalid email/password, or account disabled !'
end

Quand je test, un bon login avec un mauvais mot de passe, j’ai bien mon message d’erreur, si le booléen est à true et que je rentre le bon login et le bon mot de passe ça va bien sur ma page dashboard, par contre, si le booléen est à false et que mon login et mon mot de passe sont corrects, ça renvoi sur ma page dashboard avec une erreur ‘You are already signed in.’ au lieu de m’afficher un message d’erreur et rester sur la page de login.

Le même code dans le controller pour l’api fonctionne sans souci et le json me renvoi bien mon erreur.

J’ai raté un truc ?

Merci de votre aide.


#2

Bon, ne trouvant pas le pourquoi du comment du parce que j’ai opté pour une autre solution …

Donc j’ai ajouté ça dans mon model user :

    def active_for_authentication? 
        super && FlgEnbl? 
      end 

  def inactive_message 
    if !FlgEnbl? 
      :not_approved 
    else 
      super
    end 
  end

Reste juste à ajouter le message pour :not_approved dans le i118n de devise dans la rubrique Failure.