多角色认证

问题描述 投票:3回答:1

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

    instance YesodAuth App where
       type AuthId App = AdminId

用于验证管理员或

   instance YesodAuth App where
       type AuthId App = UserId

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

haskell yesod
1个回答
0
投票

我将创建Role类型并保留字段(必须在与由于使用了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未导出,因此您需要在本地重新定义。

© www.soinside.com 2019 - 2024. All rights reserved.