【问题标题】:Multi Role Authentication多角色身份验证
【发布时间】:2015-05-31 22:37:50
【问题描述】:

我正在尝试使用两种不同类型的登录开发一个 yesod 应用程序:管理员和用户。我在 config/model 中设置了两个模型,并通过脚手架工具在数据库中自动生成了相应的表。但是,我不知道如何进行身份验证:我可以做任何一个

    instance YesodAuth App where
       type AuthId App = AdminId

验证管理员身份或

   instance YesodAuth App where
       type AuthId App = UserId

对用户进行身份验证。但是我如何同时做这两个呢? TIA。

【问题讨论】:

  • 我认为通常admin 只是users 表上的布尔属性。你有什么理由要为他们单独的表?
  • 我希望管理员和用户之间建立一对多的关系,以便管理员可以管理用户,例如他们的个人资料和其他信息。
  • 我能想到的一个解决方案是让两个独立的 yesod 应用程序连接到同一个数据库,一个针对管理员进行身份验证,另一个针对用户进行身份验证。要做的工作更多,但总体而言,在架构性能和安全性方面可能会更好。

标签: haskell yesod


【解决方案1】:

我会创建一个Role 类型和持久字段(必须在单独的文件中声明 由于 Template Haskell,它被用作字段。

import Database.Persist.TH

data Role 
  = User
  | Admin

derivePersistField "Role"

这是将使用Role 作为字段的数据库表。

User
    email String
    role Role

AuthId 定义为UserId

instance YesodAuth App where
  type AuthId App = UserId

现在创建一个函数来查找用户并检查它是否具有Admin 角色。 您可能需要修复一些函数调用和类型,因为我没有编译 这是本地的。

isAdmin role = 
  case role of
    User  -> False
    Admin -> True

requireAdmin = do
  mEntityUser <- maybeAuth
  case mEntityUser of
    Just entityUser -> 
      if isAdmin . entityVal $ entityUser
        then pure entityUser
        else handleAuthLack
    _ -> handleAuthLack

很遗憾,Yesod.Auth.handleAuthLack 没有导出,因此您需要在本地重新定义它。

【讨论】:

    猜你喜欢
    • 2016-09-23
    • 1970-01-01
    • 2021-03-10
    • 1970-01-01
    • 1970-01-01
    • 2016-12-22
    • 2013-08-23
    • 2020-08-13
    • 2020-12-26
    相关资源
    最近更新 更多