我正在尝试使用Yesod(一个博客应用)在https://www.youtube.com/watch?v=SadfV-qbVg8之后做一个非常简单的应用程序(我使用了脚手架网站)
我想添加一个简单的身份验证来保护文章创建的访问权。
关注http://www.yesodweb.com/book/authentication-and-authorization后,我补充道:
-- Routes not requiring authentication.
isAuthorized (AuthR _) _ = return Authorized
isAuthorized FaviconR _ = return Authorized
isAuthorized RobotsR _ = return Authorized
isAuthorized PublishArticleR _ = isAdmin
-- Default to Authorized for now.
isAuthorized _ _ = return Authorized
我的新路线是PublishArticleR。 isAdmin函数与书中的相同:
isAdmin = do
mu <- maybeAuthId
return $ case mu of
Nothing -> AuthenticationRequired
Just "admin" -> Authorized
Just _ -> Unauthorized "You must be an admin"
它没有编译:(
Foundation.hs:76:38:
No instance for (IsString UserId) arising from a use of ‘isAdmin’
In the expression: isAdmin
In an equation for ‘isAuthorized’:
isAuthorized PublishArticleR _ = isAdmin
In the instance declaration for ‘Yesod App’
我不明白我做错了什么......
谢谢,
修改
有关我的AuthId的更多信息,它的定义如下:
type AuthId App = UserId
我的模特是:
User
ident Text
password Text Maybe
UniqueUser ident
deriving Typeable
我想检查ident属性是否等于某些内容(例如我的电子邮件地址)以授权发布新文章。
答案 0 :(得分:1)
maybeAuthId
将返回AuthId
个对象。在yesod书的示例中,AuthId
只是Text
的同义词:它只是一个用户名。 Text
个对象(以及具有IsString
个实例的其他类型)可以从字符串文字构建,这就是示例代码有效的原因:Haskell知道如何转换
“管理员”
进入Text
对象。
您使用更复杂的类型来表示已登录的用户,因此您需要为User提供一个IsString实例(例如,这将构建一个没有密码的用户):
instance IsString User where
fromString s = User (pack s) ""
或者,也许更容易,修改您的isAdmin
函数以获取ident
对象的User
部分,例如:
isAdmin = do
mu <- maybeAuthId
return $ case mu of
Nothing -> AuthenticationRequired
Just (User ident _) -> case ident of
"admin" -> Authorized
_ -> Unauthorized "You must be an admin"
EDIT 我误解了你对AuthId的定义,我认为它是
type AuthId App = User
实际上,您拥有的是UserID,它是数据库中User对象的ID。因此,您可以执行以下两项操作:预先计算具有管理员权限的用户的ID列表,并查看用户ID mayAuthId是否为您提供其中之一,或者从给定ID读取数据库中的用户并查看他是否拥有权限...