2009-12-03 3 views
0

Я пытаюсь сделать так, чтобы пользователи могли войти в систему как можно быстрее, поэтому я хочу, чтобы пользователи могли входить в систему и создавать записи в той же форме.Аутентификация пользователя в отдельном контроллере с Restful_authentication

Возможно ли аутентифицировать пользователя с плагином restful_authentication с любого контроллера, вызвав вызов метода create в контроллере сеанса и вернуть аутентифицированного пользователя? Кажется, что это можно сделать легко, но я просто не могу понять, как это сделать в Rails.

Может быть что-то вроде:

 

#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 

Любые идеи о том, как сделать это будет оценен по достоинству!

ответ

0

Я тестировал этот код на Rails 2.3.4, и он работает; пользователь должен войти в систему. Имейте в виду, что вы должны попытаться реорганизовать, чтобы код аутентификации находился в одном месте, а не дублировал его на нескольких контроллерах.

Обратите также внимание на то, что код аутентификации в этом фрагменте является упрощенной версией этого в контроллере сеансов, &, поэтому не выполняет никаких функций «запомнить меня».

# 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

Найджел Торн (http://stackoverflow.com/users/23963/nigel-thorne) предположил, что отказ аутентификации должен действительно вернуть HTTP 401 (Несанкционированное), а не каких-либо ошибок в @stack. Он тоже прав :-) –

+0

Или, в случае с не-XML, перенаправляйтесь на страницу входа в систему. –