我正在尝试开发具有两种不同类型登录名的yesod应用程序:管理员和用户。我在config / model中设置了两个模型,相应的表由脚手架工具自动在数据库中生成。但是,我不知道如何进行身份验证:我可以执行任一操作
instance YesodAuth App where
type AuthId App = AdminId
用于验证管理员或
instance YesodAuth App where
type AuthId App = UserId
验证用户身份。但是我如何同时做这两个呢? TIA。
我将创建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未导出,因此您需要在本地重新定义。