Snap 框架 - 限制对整个网站的访问,包括其子快照

Snap framework - Restrict access to the whole website including its subsnaplets

我有一个简单的 snaplet,它有自己的路由并且几乎独立于整个应用程序的行为。但是,对于大多数应用程序,我想将新的简单 snaplet 隐藏在限制区域下,只有登录用户才能进入。

对于根 snaplet,问题通过使用简单函数 restricted 解决,该函数接受处理程序并检查用户是否已登录,进一步处理给定的处理程序或重定向到登录屏幕。

这是整个配置:

appInit :: SnapletInit App App
appInit = makeSnaplet "myapp" "My Example Application" Nothing $ do
  fs <- nestSnaplet "foo" foo fooInit
  ss <- nestSnaplet "sess" sess $ 
    initCookieSessionManager "site_key.txt" "sess" (Just 3600)
  as <- nestSnaplet "auth" auth $ 
    initJsonFileAuthManager defAuthSettings sess "users.json"
  addRoutes [("content", restricted $ render "content"),
             ("login", login)]
  return $ App ss as fs

restricted :: Handler App App () -> Handler App App ()
restricted = requireUser auth (redirect "/login")

fooInit :: SnapletInit b Foo
fooInit = makeSnaplet "foo" "A nested snaplet" Nothing $ do
    addRoutes [("info", writeText "Only registered users can have acess to it")]
    return Foo

如果我输入 http://mywebsite/foo/info,我将能够在不记录子快照的情况下看到它的内容。在我看来,如果不更改该 snaplet 并修改其路由,我无法保护在我的新 Foo 中实现的所有处理程序。还是我错了?

P.S.: 有一个选项可以使用 weapSite 并检查请求 URL,但因为它意味着基于 URL 的验证,而不是追索权,(在这种情况下是处理程序)对我来说似乎不合适。

这里的答案是使用wrapSite function。它需要一个参数 (Handler b v () -> Handler b v ()),这正是您的 restricted 函数的类型签名。