使用 bidi 包装资源处理程序
Wrapping resource handlers with bidi
如何使用 friend 和 bidi 来包装资源处理程序?
我已成功让 oAuth 验证路由:
(defn auth-handler [request] (friend/authorize #{::user}
{:status 200
:body "a secret"}))
(def routes ["/" {true auth-handler}])
(def app (make-handler routes))
(web/run-dmc (-> app
var
(friend/authenticate
{:allow-anon? true
:workflows [(oauth/workflow
{:client-config client-config
:uri-config uri-config
:credential-fn credential-fn})]})
(wrap-resource "public")
(wrap-defaults site-defaults)
))
这适用于“/”路由,但我想确保某些资源在没有先授权的情况下无法访问。
这似乎可以通过 friend/wrap-authorize
函数实现:
我最接近的尝试在 auth 包装路由上有效,但在非 /dev/ 路由上不匹配:
(def routes ["/" [["dev/" [[true (friend/wrap-authorize (resources {:prefix "dev/"}) #{::user})]]]
[true (resources {:prefix "public/"})]]])
(match-route routes "/dev/index.html")
=>
{:handler #object[cemerick.friend$wrap_authorize$fn__24411
0x2400d0be
"cemerick.friend$wrap_authorize$fn__24411@2400d0be"]}
;correct
(match-route routes "/index.html")
=>
nil
;not correct
我认为路由模式 [true (resources {:prefix "public/"})]
的匹配部分是错误的,因为当我将其更改为 :key
时,“index.html”确实匹配。
如何将非 /dev/* 路由匹配到 public 资源?
这里的主要问题是资源路由应该是
["" (resources {:prefix "public/"})]
空字符串而不是 true
。
文档确实指出:模式匹配后,路径的剩余部分将添加到给定的前缀。
但坦率地说,我认为这是非常令人惊讶的行为。
我在这里做了一个成功路由 /index.html 的最小示例项目
https://github.com/timothypratley/bidi-resources
值得注意的是,请求 /index.html2 会导致异常,这又完全不是我所期望的。我期待 404。o_O
我真的很喜欢 ClojureScript 中的 bidi,但到目前为止,我发现它在服务器端是一个艰难的过程...我了解为什么 true
不起作用的方法是覆盖资源用我自己的版本定义打印出输入,并看到 :remainder
是空的。
如何使用 friend 和 bidi 来包装资源处理程序?
我已成功让 oAuth 验证路由:
(defn auth-handler [request] (friend/authorize #{::user}
{:status 200
:body "a secret"}))
(def routes ["/" {true auth-handler}])
(def app (make-handler routes))
(web/run-dmc (-> app
var
(friend/authenticate
{:allow-anon? true
:workflows [(oauth/workflow
{:client-config client-config
:uri-config uri-config
:credential-fn credential-fn})]})
(wrap-resource "public")
(wrap-defaults site-defaults)
))
这适用于“/”路由,但我想确保某些资源在没有先授权的情况下无法访问。
这似乎可以通过 friend/wrap-authorize
函数实现:
我最接近的尝试在 auth 包装路由上有效,但在非 /dev/ 路由上不匹配:
(def routes ["/" [["dev/" [[true (friend/wrap-authorize (resources {:prefix "dev/"}) #{::user})]]]
[true (resources {:prefix "public/"})]]])
(match-route routes "/dev/index.html")
=>
{:handler #object[cemerick.friend$wrap_authorize$fn__24411
0x2400d0be
"cemerick.friend$wrap_authorize$fn__24411@2400d0be"]}
;correct
(match-route routes "/index.html")
=>
nil
;not correct
我认为路由模式 [true (resources {:prefix "public/"})]
的匹配部分是错误的,因为当我将其更改为 :key
时,“index.html”确实匹配。
如何将非 /dev/* 路由匹配到 public 资源?
这里的主要问题是资源路由应该是
["" (resources {:prefix "public/"})]
空字符串而不是 true
。
文档确实指出:模式匹配后,路径的剩余部分将添加到给定的前缀。
但坦率地说,我认为这是非常令人惊讶的行为。
我在这里做了一个成功路由 /index.html 的最小示例项目 https://github.com/timothypratley/bidi-resources
值得注意的是,请求 /index.html2 会导致异常,这又完全不是我所期望的。我期待 404。o_O
我真的很喜欢 ClojureScript 中的 bidi,但到目前为止,我发现它在服务器端是一个艰难的过程...我了解为什么 true
不起作用的方法是覆盖资源用我自己的版本定义打印出输入,并看到 :remainder
是空的。