Haskell 是根据应用程序设置进行硬编码身份验证

Haskell 是根据应用程序设置进行硬编码身份验证,haskell,monads,yesod,Haskell,Monads,Yesod,我正在尝试将硬编码身份验证设置为依赖于来自Yesod数据库的config/settings.yml中指定的登录信息。我编写了以下代码: instance YesodAuthHardcoded App where validatePassword u = do app <- getYesod let user = appUser $ appSettings app return . validPassword user u . from

我正在尝试将硬编码身份验证设置为依赖于来自Yesod数据库的
config/settings.yml
中指定的登录信息。我编写了以下代码:

instance YesodAuthHardcoded App where
    validatePassword u = do
        app <- getYesod
        let user = appUser $ appSettings app
        return . validPassword user u . fromString . unpack
    doesUserNameExist = do
        app <- getYesod
        return . isJust . lookupUser app
的原型验证密码

AuthHandler

最后
getYesod

从这些定义看来,应该有一种方法可以让我从
AuthHandler
monad调用
getYesod
,但我不知道如何调用


编辑: 我已将
yesod
及其支架更新为最新版本。我还修改了
validatePassword
,如下所示:

validatePassword u = do
    app <- liftHandler . getYesod
    let user = appUser $ appSettings app
    return . validPassword user u . fromString . unpack
validatePassword u=do

app错误源于我试图修改
Yesod.Auth.Hardcoded
模块给出的代码段。我引入了一个与省略的参数冲突的
do
符号。指定参数可以解决问题,代码将变为:

instance YesodAuthHardcoded App where
    validatePassword u p = do
        app <- getYesod
        let user = appUser $ appSettings app
        return . validPassword user u . fromString $ unpack p
    doesUserNameExist u = do
        app <- getYesod
        return . isJust $ lookupUser app u
实例YesDouthHardcoded应用程序,其中
验证密码u p=do

我怀疑你需要在某处插入
liftHandler
liftSubHandler
type MonadAuthHandler master m = (MonadHandler m, YesodAuth master, master ~ HandlerSite m, Auth ~ SubHandlerSite m, MonadUnliftIO m)

type AuthHandler master a = forall m. MonadAuthHandler master m => m a 
getYesod :: MonadHandler m => m (HandlerSite m)
validatePassword u = do
    app <- liftHandler . getYesod
    let user = appUser $ appSettings app
    return . validPassword user u . fromString . unpack
    • Couldn't match type ‘m1 a1’ with ‘App’
      Expected type: HandlerFor (HandlerSite m1) a1 -> App
        Actual type: HandlerFor (HandlerSite m1) a1 -> m1 a1
    • In the first argument of ‘(.)’, namely ‘liftHandler’
      In a stmt of a 'do' block: app <- liftHandler . getYesod
      In the expression:
        do app <- liftHandler . getYesod
           let user = appUser $ appSettings app
           return . validPassword user u . fromString . unpack
    |
259 |         app <- liftHandler . getYesod
    |
instance YesodAuthHardcoded App where
    validatePassword u p = do
        app <- getYesod
        let user = appUser $ appSettings app
        return . validPassword user u . fromString $ unpack p
    doesUserNameExist u = do
        app <- getYesod
        return . isJust $ lookupUser app u