使用BrowserId和脚手架网站的Yesod admin auth

时间:2015-06-19 12:22:37

标签: haskell yesod

我正在尝试使用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属性是否等于某些内容(例如我的电子邮件地址)以授权发布新文章。

1 个答案:

答案 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读取数据库中的用户并查看他是否拥有权限...