2009-12-03 9 views
0

J'essaie de permettre aux utilisateurs de se connecter aussi rapidement que possible. Je veux donc que les utilisateurs puissent se connecter et créer des enregistrements sous la même forme.Authentification d'un utilisateur dans un contrôleur séparé avec Restful_authentication

Est-il possible d'authentifier un utilisateur avec le plugin restful_authentication à partir de n'importe quel contrôleur en appelant d'une manière ou d'une autre la méthode create dans le contrôleur de session, et renvoyez l'utilisateur authentifié? Il semble que cela puisse être fait facilement, mais je n'arrive pas à comprendre comment le faire dans Rails.

Peut-être quelque chose comme:

 

#Records Controller 

def create 
    if params[:login] && params[:password] 
     #This method would call /session/ and pass the login/password params 
     user = authenticate_user(params[:login'], params[:password]) 
    end 

    @record = Record.new(params[:record]) 
    @record.user = user 

    if @question.save && user 
     flash[:notice] = 'Record was successfully created.' 
     redirect_to(@record) 
    end 
end 

Toutes les idées sur la façon de le faire serait apprécié!

Répondre

0

J'ai testé ce code sur Rails 2.3.4 et cela fonctionne; l'utilisateur reste connecté. Gardez à l'esprit que vous devriez essayer de refactoriser de sorte que le code d'authentification réside dans un seul endroit, plutôt que de le dupliquer dans plusieurs contrôleurs.

Notez également que le code d'authentification dans cet extrait est une version simplifiée de celui dans le contrôleur Sessions, &, donc ne gère pas la fonctionnalité «se souvenir de moi».

# POST /stacks 
# POST /stacks.xml 
def create 
    @stack = Stack.new(params[:stack]) 

    if params[:login] && params[:password] 
    logout_keeping_session! 
    user = User.authenticate(params[:login], params[:password]) 
    self.current_user = user 
    end 

    respond_to do |format| 
    if !user 
     flash[:error] = 'Login details incorrect.' 
     format.html { render :action => "new" } 
     format.xml { render :xml => @stack.errors, :status => :unprocessable_entity } 
    elsif @stack.save 
     flash[:notice] = 'Stack was successfully created.' 
     format.html { redirect_to(@stack) } 
     format.xml { render :xml => @stack, :status => :created, :location => @stack } 
    else 
     format.html { render :action => "new" } 
     format.xml { render :xml => @stack.errors, :status => :unprocessable_entity } 
    end 
    end 
end 
+0

Nigel Thorne (http://stackoverflow.com/users/23963/nigel-thorne) a suggéré que l'absence d'authentification doit vraiment revenir un HTTP 401 (non autorisée) plutôt que des erreurs dans @stack. Il a raison aussi :-) –

+0

Ou, dans le cas non-XML, rediriger vers la page de connexion. –