devise + omniauth devise helper, например current_user, user_signed_in?не работает - PullRequest
0 голосов
/ 28 марта 2012

Я использую devise и создаю логин через Facebook, используя omniauth, но у меня проблема с утратой доступа к вспомогательным методам devise, таким как current_user и user_signed_in?методы не работают.

EDIT

AuthenticationController

def create
    omniauth = request.env["omniauth.auth"]    
    user = User.find_by_provider_and_uid(omniauth["provider"], omniauth["uid"]) ||       User.create_with_omniauth(omniauth)    
    session[:user_id] = user.id    
    redirect_to dashboard_path(user.id), :notice => "Signed in!"    
end  

redirect_to Метод панели управления USercontroller

UserController

before_filter  :logged_in

 def dashboard    
    @user = User.find(params[:id])   
    @comment = Comment.new    
    @comments = @user.comments.all.paginate(:page => params[:page], :per_page => 5)    
 end 

, поэтому здесь элемент управления должен перейти на панель мониторингаметод после проверки метод logged_in в ApplicationController

метод logged_in в ApplicationController

Application Controller

def logged_in    
    if user_signed_in?     
       return true    
    else    
       redirect_to root_path    
       flash[:message] = "please login"    
    end     
  end 

при входе в систему через facebook следующий код, сгенерированный на консоли

Started GET "/users/52/dashboard" for 127.0.0.1 at Thu Mar 29 12:51:55 +0530 2012     
Processing by UsersController#dashboard as HTML     
  Parameters: {"id"=>"52"}     
Redirected to http://localhost:3000/     
Filter chain halted as :logged_in rendered or redirected     
Completed 302 Found in 2ms (ActiveRecord: 0.0ms)     

в приведенном выше элементе управления кодом выполняется рендеринг из метода logged_in в root_path, но он должен отображать dashboard_path

Итак, я предполагаю, что User_signed_in?помощник не работает, я также использую current_user вместо того, чтобы генерировать ту же ошибку

Ответы [ 2 ]

6 голосов
/ 29 марта 2012

Как я вижу, user_signed_in? работает, но возвращает false, поскольку для Devise пользователь не вошел в систему. Чтобы это исправить, просто замените сохранение идентификатора сеанса на метод Devise sign_in в действии вашего контроллера:

def create
    omniauth = request.env["omniauth.auth"]    
    user = User.find_by_provider_and_uid(omniauth["provider"], omniauth["uid"]) ||       User.create_with_omniauth(omniauth)    
    sign_in(:user, user)

    # actually if you really really need that id in the session, you can leave this line too :)
    session[:user_id] = user.id 

    redirect_to dashboard_path(user.id), :notice => "Signed in!"    
end 
0 голосов
/ 28 марта 2012

После создания учетной записи через Facebook, как войти в систему?

Вы все равно должны использовать помощников, таких как sign_in_and_redirect. Что-то вроде:

user = User.build_from_omniauth(omniauth)
if user.save
  sign_in_and_redirect(:user, user)
end

Тогда вы сможете использовать таких помощников, как current_user и user_signed_in? (которые просто проверяют, не равен ли current_user ноль).


Если посмотреть на ваши изменения, мой ответ остается в силе. Что вам нужно сделать, это использовать sign_in_and_redirect(:user, user) вместо того, чтобы просто установить идентификатор в сеансе. Вы можете легко настроить направление перенаправления пользователя после входа в систему с помощью devise.

Еще одна вещь, удалите этот фильтр logged_in, у Devise есть метод authenticate_user!, который вы можете использовать в качестве before_filter. Он перенаправит пользователя на страницу входа, а при входе он перенаправит его на страницу, к которой он пытался получить доступ.

Вы используете Devise, поэтому постарайтесь воспользоваться этим и прочитайте документацию;)

...