Haskell Yesod:具有授权的静态子网站

Haskell Yesod:具有授权的静态子网站,haskell,yesod,Haskell,Yesod,完全重写以包括改进的理解 Yesodtypeclass包含功能isAuthorized,您可以调整该功能,以便不同的用户组只能访问不同的路由。 脚手架站点展示了如何实现这一点的示例,包括向所有人提供授权子网站: isAuthorized(AuthR)\=returnauthorized 脚手架站点还包含一个静态内容的子网站,这很有帮助。但是:该静态子网站不尊重您在中所做的事,因为您已获得授权。您可以通过添加模式匹配来检查这一点,如 isAuthorized(StaticR)\=error“永远

完全重写以包括改进的理解

Yesod
typeclass包含功能
isAuthorized
,您可以调整该功能,以便不同的用户组只能访问不同的路由。 脚手架站点展示了如何实现这一点的示例,包括向所有人提供授权子网站:

isAuthorized(AuthR)\=returnauthorized
脚手架站点还包含一个静态内容的子网站,这很有帮助。但是:该静态子网站不尊重您在
中所做的事,因为您已获得授权。您可以通过添加模式匹配来检查这一点,如

isAuthorized(StaticR)\=error“永远不会到达此错误”
您仍然可以访问所有静态内容(包括新创建的内容),并且永远不会遇到这种模式匹配

让每个人都能访问像bootstrap或jquery这样的内容确实有点道理。不过,同样的结果也可以通过授予
isAuthorized
并始终返回
Authorized
,与授权子网站或favicon处理程序的操作方式相同

我个人希望在派遣方面更进一步

isAuthorized(StaticR(StaticRoute(“public”):
isAuthorized(StaticR(StaticRoute(“admin”):\uux))\ux=checkIsAdmin
isAuthorized(StaticR(StaticRoute(“猫”):\u)\ uFalse=选中允许查看猫
:
似乎唯一缺少的一点是使静态子网站接受检查或添加一个这样做的垫片


可悲的是,子网站有大量复杂的代码,模板是haskell,还有很多神奇的东西,比如在可执行文件中嵌入文件。它被纳入脚手架的方式更有魔力。我还正在学习子网站和我的培训,以便在诸如类型族或
Q Def
之类的上下文中,将类型视为文档失败。由于这些原因,我不知道如何添加支票。任何指点都将不胜感激。

因此我找到了一个不完美的答案,就目前而言,这个答案已经足够好了

我不知道如何使静态站点的行为有所不同。它似乎以某种方式使用了wai服务器的底层功能,因此它甚至从未触及它的YesSOD部分。由于子网站似乎比核心系统做得更早,这是我唯一可以改变某些事情的地方。让核心系统排在最后的选择很奇怪,但不管怎样,这可能是有原因的

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

getStaticCatContentHtmlR::Text->Handler值
getStaticCatContentHtmlR路径=do
让filePath=“static/cats/html”解包路径
sendFile“text/html”文件路径
只需将您的静态子网站指向
static/public
即可,为每个子网站创建三个新的html、css和js子文件夹,添加三个具有适当权限的相应处理程序,然后即可完成。路由系统确保用户不能请求类似于
/static/cats/html/。/../../../
的路径

但也有一些缺点

  • 是的,它不能做任何优化
  • 丢失文件或错误路由导致的错误不会使服务器崩溃,但错误响应非常可怕。当然,你可以自己发现错误
  • 在YesSOD中没有任何路由工具,因此必须手动执行并取消选中
  • 此子网站中的所有路由都应该是相对的,这样当您将服务器从开发移动到部署时,错误就会减少。这可能不是一个缺点,但它限制了你的选择
是否值得创建一个子网站来捆绑这三个处理程序?嗯,也许作为一种训练