Yesod Жестко закодированная аутентификация в зависимости от AppSettings - PullRequest
0 голосов
/ 06 июня 2018

Я пытаюсь настроить жестко запрограммированную аутентификацию, чтобы полагаться на информацию для входа в систему, указанную в config/settings.yml из лесов Yesod.Я написал следующий код:

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

И получаю следующее сообщение об ошибке для validatePassord и эквивалент для doesUserNameExist:

• Couldn't match type ‘HandlerSite ((->) Text)’ with ‘App’
  Expected type: Text -> App
    Actual type: Text -> HandlerSite ((->) Text)
• In a stmt of a 'do' block: app <- getYesod
  In the expression:
    do { app <- getYesod;
         let user = appUser $ appSettings app;
         return . validPassword user u . fromString . unpack }
  In an equation for ‘validatePassword’:
      validatePassword u
        = do { app <- getYesod;
               let user = ...;
               return . validPassword user u . fromString . unpack }

Прототип validatePassword определяется в Yesod.Auth.Hardcoded:

validatePassword :: Text -> Text -> AuthHandler site Bool

, а AuthHandler определяется в Yesod.Auth:

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 определяется следующим образом в Yesod.Core.Handler:

getYesod :: MonadHandler m => m (HandlerSite m)

Из этих определений следует, что у меня должен быть способ вызвать getYesod из монады AuthHandler, ноЯ не могу понять, как.


РЕДАКТИРОВАТЬ: Я обновил yesod и его леса до последней версии.Я также изменил validatePassword следующим образом:

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
    |

1 Ответ

0 голосов
/ 10 июня 2018

Ошибка произошла из-за моей попытки изменить фрагмент кода, заданный модулем 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
...