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
函数的类型签名。
我有一个简单的 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
函数的类型签名。