【问题标题】:How to do (role-based) access control in Yesod?如何在 Yesod 中进行(基于角色的)访问控制?
【发布时间】:2014-04-12 15:01:18
【问题描述】:

我想知道在 Yesod 中向用户/Handlers 或资源添加角色/权限的最佳方法是什么。有没有人有这种东西的现有技术?是否有任何方法可以利用类型系统来帮助防止失误(并将数据库查询以检查所有权等保持在最低限度)?

编辑:很抱歉事先错过了这个 - 我确实注意到实际上有一个部分,我第一眼就错过了(我想是因为没有提到访问/角色/权限),在Authorization是的书。这似乎在路由器级别使用 PUT/POST 的写入标志进行访问控制。它本身看起来并不是很复杂,但它看起来很适合在上面构建抽象......

【问题讨论】:

    标签: haskell authorization yesod access-control rbac


    【解决方案1】:

    自发布此消息以来,我发现 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 脚手架中?)

    【讨论】:

    • PS 我在 yesod 食谱 github.com/yesodweb/yesod/wiki/Cookbook#wiki-auth987654322@ 中添加了博客文章的链接
    • 嗨 - 只是想让你知道,很高兴你回来更新这篇文章 - Haskell 信息的可发现性并不是最好的,所以在谷歌搜索结果中显示这个非常有用.
    • 没问题,很高兴能帮上忙!
    猜你喜欢
    • 2016-05-06
    • 2019-07-24
    • 2010-09-11
    • 2012-06-25
    • 2011-11-02
    • 2013-08-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多