我想知道在Yesod中向Handler
或资源的用户/权限添加角色的最佳方法是什么。有没有人有这种东西的先前艺术?是否有任何方法利用类型系统来帮助防止漏洞(并且还要保持数据库查询以检查所有权等)?
编辑:很抱歉错过了这个 - 我确实注意到实际上有一个部分,我乍一看(我认为因为没有提及访问/角色/权限),Authorization在Yesod书中。这似乎在路由器级别使用PUT / POST的写标志进行访问控制。它本身看起来并不复杂,但它看起来很适合在顶部构建抽象......
答案 0 :(得分:4)
自发布此消息以来,我发现了Felipe Lessa撰写的这篇非常有用的博文Abstracting permissions with Yesod。它构建于现有isAuthorized
函数之上,演示了向用户添加角色和访问资源权限的简单策略。
基本上它定义了
isAuthorizedTo :: Maybe (UserId, User) -> [Permission] -> YesodDB sub Blog AuthResult
permissionsRequiredFor :: Route Blog -> Bool -> [Permission]
为了得到这样的东西:
isAuthorized route isWrite = do
mauth <- maybeAuth
runDB $ mauth `isAuthorizedTo` permissionsRequiredFor route isWrite
其中permissionsRequiredFor
返回一些用户定义的Permission
数据类型的列表,如下所示:
data Permission = Post -- Permission to create blog posts
| CommentOn EntryId -- Permission to comment on a particular blog entry
| View EntryId -- Permission to view a particular blog entry
这很简单实用,谢谢Felipe。 (如果有人试图以库的形式捕获这种东西并发布到Hackage以便尽快找到并放弃访问控制到你的应用程序中,可能会很好!或者也许在Yesod脚手架中?)