【发布时间】:2016-11-02 01:27:57
【问题描述】:
完全重写以包括更好的理解
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 等上下文中失败。由于这些原因,我无法弄清楚如何添加支票。任何指针将不胜感激。
【问题讨论】: