我在设计后遇到这些问题:
在这里查看服务器日志会发生什么:
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
答案 0 :(得分:2)
你应该这样做:
确保您的布局中有<%= csrf_meta_tag %>
将beforeSend
添加到所有ajax请求中以设置标题,如下所示:
$.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_tag
。
WARNING: Can't verify CSRF token authenticity rails可能会有所帮助。