Я пытаюсь настроить жестко запрограммированную аутентификацию, чтобы полагаться на информацию для входа в систему, указанную в 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
|