为解放器的句柄输出html - 未授权

时间:2013-09-13 03:55:31

标签: clojure compojure liberator

我正在使用带有ring / compojure的解析器,并希望使用解放器defresource宏来处理授权。我可以轻松地handle-ok输出浏览器识别的html,但handle-unauthorized会在pre标记中输出html。

我怀疑我无法找到如何做到这一点意味着有充分的理由不这样做。我在网上看到的所有示例都显示handle-unauthorized返回文字,但我希望显示自定义页面。

这是我正在使用的代码(的一个版本)。我正在使用Hiccup:

(defresource deny-all
  :authorized? (fn [_] false)
  :available-media-types ["text/html"]
  :handle-ok (fn [ctx] (html5 [:body [:h1 "Yes!"]])))
  :handle-unauthorized (fn [ctx] (html5 [:body [:h1 "Noooo!"]])))

我从浏览器中获得的是文字

<!DOCTYPE html>
<html><body><h1>Noooo!</h1></body></html>
</pre>

如果我将authorized?更改为true,则会正确输出html。

我尝试过返回响铃式响应,但这些也会引发错误。我错过了什么?

1 个答案:

答案 0 :(得分:2)

在REST talk中,html是资源的许多可能表示之一。由于资源是未经授权的,因此不应返回任何表示,HTML或其他形式。相反,由401状态错误指示的客户端应采取不同的操作过程,例如请求登录页面。

在Web框架中编写的大多数应用程序都不会返回401,而是重定向到授权页面。这在Liberator中也是可能的,因为没有什么能阻止你处理资源本身的授权(使用逻辑处理ok)。

这可能违反了惯例。我在Liberator的github上发布了一个issue来询问那些对RESTful烹饪方法更有见识的人的意见。

无论如何,您认为html包装在预标记中的原因是以下因素的结果:

  1. 内容协商不适用于Liberator中未经授权的资源。 401的主体始终是text / plain类型。
  2. 当您指定html字符串作为响应时,它将按原样呈现。
  3. 使用Chrome开发工具时,在检查来源时,您会看到html字符串包含在pre标记中。
  4. 我希望这会有所帮助。