2016-06-30 40 views
1

完全重写,包括改善的理解耶索德:静子网站与授权

Yesod类型类包含的功能isAuthorized,你能适应这样不同的路线仅适用于不同的用户组访问。 脚手架网站显示的是如何做到这一点,包括作出授权子网站提供给大家举例:

isAuthorized (AuthR _) _ = return Authorized 

脚手架网站也很有帮助包括静态内容的子网站。但是:该静态子网站并不尊重您在isAuthorized中所做的事情。您可以检查通过添加一个模式匹配像

isAuthorized (StaticR _) _ = error "this error is never reached" 

您仍然可以访问所有静态内容(包括新建一个),你永远不会遇到这样的模式匹配。

确实让每个人都可以访问像bootstrap或jquery这样的内容。仍然可以通过遵守isAuthorized并始终返回Authorized来实现相同的结果,这与使用授权子网站或图标处理程序完成的方式相同。

我个人希望更进一步与调度像

isAuthorized (StaticR (StaticRoute ("public":_) _)) _  = pure Authorized 
isAuthorized (StaticR (StaticRoute ("admin" :_) _)) _  = checkIsAdmin 
isAuthorized (StaticR (StaticRoute ("cats" :_) _)) False = checkIsAllowedToViewCats 
: 

看来唯一缺少的位,让静态子网站兑现支票或加垫片,做。

不幸的是,该子网站是模板haskell的大量复杂的代码和很多魔术做复杂的事情,如嵌入文件在可执行文件。它包含在脚手架中的方式有​​更多的魔力。我也只是了解子网站和我的培训,以查看类型为文档在类型系列或Q Def等情况下失败。由于这些原因,我无法弄清楚如何添加支票。任何指针将不胜感激。

回答

1

所以我发现了一个不完美的答案,足以满足我目前的需求。

我想不出如何使静态站点行为有所不同。它似乎以某种方式使用了wai服务器的基础功能,所以它甚至从未涉及到Yesod的一部分。由于子系统似乎在核心系统之前进行调度,这是唯一可以改变某些事情的地方。奇怪的选择是让核心系统排在最后,但是无论如何,这可能是有原因的。

然后,解决方案是复制静态子网站的功能。但尽可能少的工作,请。因此,这里的最基本的处理程序,您可以创建:

getStaticCatContentHtmlR :: Text -> Handler Value 
getStaticCatContentHtmlR path = do 
    let filePath = "static/cats/html" </> unpack path 
    sendFile "text/html" filePath 

static/public只需将您的静态子网站,而不是创建每个子网站的HTML,CSS三个新的子文件夹和js,用合适的权限添加三个相应的处理程序,并完成它。路由系统确保用户不能请求像/static/cats/html/../../../这样的路径。

虽然有几个缺点。

  • Yesod无法做任何优化。
  • 缺少文件或错误路由的错误不会导致服务器崩溃,但错误响应非常糟糕。当然,你可以自己发现错误。
  • Yesod中没有任何路由工具,因此您必须手动执行并取消选中。
  • 此子网站中的所有路由都应该是相对的,这样在将服务器从开发移动到部署时,您可以获得更少的错误。这可能不是一个缺点,但它限制了你的选择。

是否值得努力创建一个子网站来捆绑这三个处理程序?那么,也许作为一个训练练习...