在ajax请求上设计用户授权

时间:2013-06-16 12:49:30

标签: javascript ruby-on-rails devise

我的问题是这个。

当用户打开两个标签并转到需要身份验证的同一页面时,一切正常。如果那时他登出标签,他显然会被重定向到登录页面,而不是在另一个标签上。这仍然是正常的。

但是,页面上有一些使用javascript的函数,如果用户尝试使用javascript,则无法执行该操作,并且呈现的“sign_in.json”包含设计错误消息“unauthenticated” 。发送此消息后,我需要将用户重定向到登录表单。我该怎么做?

2 个答案:

答案 0 :(得分:0)

听起来你使用javascript向你的服务器发出一个ajax请求,用401和一些json数据响应,对吗?如果你使用jQuery,你可以这样做:

# Your ajax call
$.ajax({
  ...
  statusCode: {
    401: function() {
      # Redirect to login
      window.location.replace("http://yoursite.com/login_page");
    }
  }
});

编辑:全局ajax设置

您可以使用如下的ajaxSetup全局更改jQuery中所有ajax请求的此行为:

$.ajaxSetup({
  statusCode: {
    401: function() {
      # Redirect to login
      window.location.replace("http://yoursite.com/login_page");
    }
  }
});

然而,jQuery文档强烈建议反对这种方法,因为这可能会打破其他插件等的预期行为。我个人认为在这个例子中会很好,只要确定你做了什么,测试一切是否按预期工作。您可以在此处阅读更多内容:http://api.jquery.com/jQuery.ajaxSetup/

答案 1 :(得分:0)

@jokklan

你的帖子非常有帮助,我确实改变了全局ajax设置,似乎工作正常。还必须发送401代码的回复。

我通过自定义Devise::FailureApp

来管理
def respond
  # ...
  elsif request.xhr?
    redirect_to some_path, status: 401
  end
  # ...
end

由于控制器响应json,重定向也发生在json中,但是通过将状态设置为401,我能够捕获并将用户重定向到我需要的路径ajaxSetup

不是最漂亮的,但我愿意接受更好的建议。