getAuthEntity завершается ошибкой «Не удалось найти ожидаемый тип» - PullRequest
0 голосов
/ 29 апреля 2018

Я пытаюсь добавить жестко закодированную аутентификацию в Yesod. Что я только что кратко изменил на платформе Yesod и добавил пользователя с жестким кодом, следуя документации (http://hackage.haskell.org/package/yesod-auth-1.6.3/docs/Yesod-Auth-Hardcoded.html). Итак, у меня есть следующий код:

instance YesodAuth App where
    type AuthId App = Either UserId Text

    -- Where to send a user after successful login
    loginDest :: App -> Route App
    loginDest _ = HomeR
    -- Where to send a user after logout
    logoutDest :: App -> Route App
    logoutDest _ = HomeR
    -- Override the above two destinations when a Referer: header is present
    redirectToReferer :: App -> Bool
    redirectToReferer _ = True

    authPlugins _ = [authHardcoded]

    authenticate Creds{..} =
        return
        (case credsPlugin of
            "hardcoded" ->
                case lookupUser credsIdent of
                    Nothing -> UserError InvalidLogin
                    Just m  -> Authenticated (Right (manUserName m)))


-- | Access function to determine if a user is logged in.
isAuthenticated :: Handler AuthResult
isAuthenticated = do
    muid <- maybeAuthId
    return $ case muid of
        Nothing -> Unauthorized "You must login to access this page"
        Just _ -> Authorized


...        

instance YesodAuthPersist App where
    type AuthEntity App = Either User SiteManager

    getAuthEntity (Left uid) =
      do x <- liftHandler $ runDB (get uid)
         return (fmap Left x)
    getAuthEntity (Right username) = return (fmap Right (lookupUser username))
...
instance PathPiece (Either UserId Text) where
    fromPathPiece = readMaybe . unpack
    toPathPiece = pack . show

lookupUser :: Text -> Maybe SiteManager
lookupUser username = find (\m -> manUserName m == username) siteManagers

instance YesodAuthHardcoded App where
    validatePassword u = return . validPassword u
    doesUserNameExist  = return . isJust . lookupUser

validPassword :: Text -> Text -> Bool
validPassword u p =
    case find (\m -> manUserName m == u && manPassWord m == p) siteManagers of
        Just _ -> True
        _      -> False

Так что похоже, что getAuthEntity был правильно реализован. Однако теперь, когда я пытаюсь получить пользователя с getAuthEntity, вот так:

getProfileR :: Handler Html
getProfileR = do
    uid <- getAuthEntity   
    defaultLayout $ do
        setTitle . toHtml $ ("hola" :: Text )
        $(widgetFile "profile")

Это просто не с ошибкой:

    • Couldn't match expected type ‘HandlerFor App a0’
                  with actual type ‘AuthId (HandlerSite m0)
                                    -> m0 (Maybe (AuthEntity (HandlerSite m0)))’
   |
12 |     uid <- getAuthEntity
   |            ^^^^^^^^^^^^^

Я совершенно заблудился относительно того, что может быть не так. Заранее спасибо за любую помощь.

1 Ответ

0 голосов
/ 29 апреля 2018

Хорошо, так что мне удалось решить эту проблему, как отмечено в комментарии, вы не можете просто позвонить getAuthEntity, но вам также нужен пользователь. Поэтому я изменил код на следующий

getProfileR :: Handler Html
getProfileR = do
    uid <- requireAuthId  
    user <- getAuthEntity uid 

    defaultLayout $ do
        -- setTitle . toHtml $ userIdent user <> "'s User page"
        setTitle . toHtml $ ("hola" :: Text )
        $(widgetFile "profile")

и затем это сработало, однако использование maybeAuthId вместо requireAuthId приведет к ошибке. Что касается того, почему я еще не уверен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...