gpt4 book ai didi

ruby-on-rails - Custom Devise 401未经授权的响应

转载 作者:行者123 更新时间:2023-12-03 12:44:52 26 4
gpt4 key购买 nike

我正在为Rails 3.1应用程序使用基于JSON的API。我想提供一个自定义的失败响应,而不是默认值:

{"error":"You need to sign in or sign up before continuing."}

我的API Controller 包括对 authenticate_user!的before_filter调用,这就是呈现此JSON响应的方式。

在搜索时,我遇到了 this StackOverflow question,它引用了 this Devise wiki entry。不幸的是,Wiki条目不够详尽,不足以让我了解它在告诉我什么。具体来说,我不知道该把代码放在哪里,以便Devise / Warden知道要呈现我想要返回的内容。

从关于另一个SA问题的评论中,听起来好像不需要调用 custom_failure!,因为我使用的是高于1.2(具体为1.4.2)的Devise版本。但是,Wiki条目没有说明 render调用应往何处去,以使 authenticate_user!知道使用它而不是自己的render调用。

这个 render调用会去哪里?

编辑:我不仅在尝试更改消息本身(设计 en.yml配置);我正在尝试更改响应的实际格式。具体来说,我想返回这个:
render :text => "You must be logged in to do that.", :status => :unauthorized

最佳答案

作为引用,以防万一在使用Devise尝试登录失败时如何自定义json错误响应时遇到其他问题时,关键是使用您自己的自定义FailureApp实现。 (您也可以使用这种方法来覆盖某些重定向行为。)

class CustomFailureApp < Devise::FailureApp
def respond
if request.format == :json
json_error_response
else
super
end
end

def json_error_response
self.status = 401
self.content_type = "application/json"
self.response_body = [ { message: i18n_message } ].to_json
end
end

devise.rb中,查找 config.warden部分:
  config.warden do |manager|
manager.failure_app = CustomFailureApp
end

一些相关信息:

起初我以为我必须重写 Devise::SessionsController,可能要使用传递给 recallwarden.authenticate!选项,但是正如 here所提到的那样,“API调用不被调用,仅导航请求被调用。如果要自定义http状态代码,则可以在失败的应用程序级别上这样做会更好。”

https://github.com/plataformatec/devise/wiki/How-To%3a-Redirect-to-a-specific-page-when-the-user-can-not-be-authenticated也显示了非常相似的重定向。

关于ruby-on-rails - Custom Devise 401未经授权的响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7297183/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com