Rails:返回401?

nee*_*zer 52 ruby-on-rails http

我想返回一个HTTP 401错误作为我permission_denieddeclarative_authorization方法的一部分.

# triggered when a user accesses a page that they don't have access to
def permission_denied
  # render my default 401 error page?
end
Run Code Online (Sandbox Code Playgroud)

我该怎么做?(原谅这个问题,如果它是愚蠢的...我知道如何在我的公共目录中呈现401.html页面,但我认为它不会返回401 HTTP标头,这就是我所追求的.)

Gar*_*ett 87

您可以添加该:status选项

def permission_denied
  render :file => "public/401.html", :status => :unauthorized
end
Run Code Online (Sandbox Code Playgroud)

  • 或者`head:unauthorized`没有内容 (25认同)
  • 如果你不想渲染任何文件或文本或模板,你也可以`````yes:true,status :: unauthorized``` (17认同)
  • 从Rails 5开始,使用以下内容进行渲染:不推荐使用:```DEPRECATION WARNING:`:nothing`选项已弃用,将在Rails 5.1中删除.使用`head`方法响应空响应体``` (4认同)
  • 添加`:layout => false`以使页面更清晰 (3认同)
  • 传递文件名中的格式显然已被弃用,因此新的方式是`render:file =>"public/401",:status =>:unauthorized`. (3认同)

CTS*_*_AE 10

在这里,您不必通过评论来寻找现代答案。

之前的答案已在 Rails 5.1 中弃用

将其中任何一个放入您的控制器操作中:

渲染文件/模板

render :file => "public/401", :status => :unauthorized
Run Code Online (Sandbox Code Playgroud)

渲染 JSON

render status: :unauthorized, json: { error: "You are not authorized to access this resource. Verify that you are passing passing your token." }
Run Code Online (Sandbox Code Playgroud)

不渲染任何内容

head :unauthorized
Run Code Online (Sandbox Code Playgroud)

请参阅 ActionController#head