设计已登录但未经授权

时间:2012-10-26 08:38:06

标签: ruby-on-rails devise

我在设计后遇到这些问题:

  • 我注册了一个新用户(工作正常)
  • 我确认用户邮件(工作正常)。那时我正常登录,一切正常。
  • 现在,如果我退出并尝试重新登录,则会收到未经授权的错误(401)。

在这里查看服务器日志会发生什么:

Started POST "/users/sign_in" for 127.0.0.1 at 2012-10-26 10:26:23 +0200
Processing by Users::SessionController#create as JSON
  Parameters: {"email"=>"olivier.milla@gmail.com", "password"=>"[FILTERED]",     "remember_me"=>"0"}
WARNING: Can't verify CSRF token authenticity
  User Load (0.0ms)  SELECT `users`.* FROM `users` WHERE `users`.`email` =     'olivier.milla@gmail.com' LIMIT 1
   (1.0ms)  BEGIN
   (0.0ms)  COMMIT
   (1.0ms)  BEGIN
   (0.0ms)  UPDATE `users` SET `current_sign_in_at` = '2012-10-26 08:26:23', `sign_in_count` = 2, `updated_at` = '2012-10-26 08:26:23' WHERE `users`.`id` = 1
   (25.0ms)  COMMIT
  Rendered devise/sessions/create.json.rabl (1.0ms)
Completed 200 OK in 135ms (Views: 22.0ms | ActiveRecord: 27.0ms)


Started GET "/accounts/new" for 127.0.0.1 at 2012-10-26 10:26:23 +0200
Processing by AccountsController#new as HTML
Completed 401 Unauthorized in 0ms

正如你所看到的,我已经登录了,我甚至得到一个呈现的视图(devise/sessions/create.json.rabl),并且在我被重定向到'/ accounts / new'之后我不再被授权了。然后我可以尝试访问我想要的任何URL并继续收到未经授权的消息。

我在一个新的db(db:reset)上试过这个,我尝试在登录前清理cookie。

知道这种行为可能来自哪里?

我正在使用Devise 2.1.2和Rails 3.2.8。

更新

根据要求:AccountsController代码:

class AccountsController < ApplicationController
  before_filter :authenticate_user!

  def :index
    @accounts = current_organization.accounts
  end

  def new
    @account = Account.new(:organization => current_organization)
  end

  def create
    @account = Account.new(params[:account])
    @account.organization = current_organization
    if @account.save
      redirect_to :index
    else
        #TODO
    end
  end
end

2 个答案:

答案 0 :(得分:2)

你应该这样做:

  1. 确保您的布局中有<%= csrf_meta_tag %>

  2. beforeSend添加到所有ajax请求中以设置标题,如下所示:


  3. $.ajax({ url: 'YOUR URL HERE',
      type: 'POST',
      beforeSend: function(xhr) {xhr.setRequestHeader('X-CSRF-Token', $('meta[name="csrf-token"]').attr('content'))},
      data: 'someData=' + someData,
      success: function(response) {
        $('#someDiv').html(response);
      }
    });
    

    来自:WARNING: Can't verify CSRF token authenticity rails


    虽然这种情况正在发生,因为您在模型中启用了:token_authentication

    你可能不想要这个。


    否则,如果您想跳过仅针对AJAX请求的身份验证,您可以执行以下操作:

    skip_before_filter :verify_authenticity_token, :if => Proc.new { |c| c.request.format == 'application/json' }
    

    关于您的真实错误,不是因为您签入了:authenticate_user!用户并在代码中使用了current_organization吗?

    因此,如果它通过了身份验证,则无需拥有current_organization值!

    希望它有所帮助!

答案 1 :(得分:0)

WARNING: Can't verify CSRF token authenticity是关键。您需要使用ajax请求传递csrf令牌,同时确保您的布局中有csrf_meta_tagWARNING: Can't verify CSRF token authenticity rails可能会有所帮助。