maybeAuthId checks that ID is valid #486

This commit is contained in:
Michael Snoyman 2013-03-24 09:30:12 +02:00
parent f3b459e9ce
commit b5a1d76a40
3 changed files with 53 additions and 9 deletions

View File

@ -20,6 +20,7 @@ module Yesod.Auth
, setCreds , setCreds
-- * User functions -- * User functions
, defaultMaybeAuthId , defaultMaybeAuthId
, maybeAuthId
, maybeAuth , maybeAuth
, requireAuthId , requireAuthId
, requireAuth , requireAuth
@ -136,15 +137,25 @@ class (Yesod master, PathPiece (AuthId master), RenderMessage master FormMessage
-- especially useful for creating an API to be accessed via some means -- especially useful for creating an API to be accessed via some means
-- other than a browser. -- other than a browser.
-- --
-- Since 1.1.2 -- Note that, if the value in the session points to an invalid
maybeAuthId :: HandlerT master IO (Maybe (AuthId master)) -- authentication record, this value could be meaningless, and in conflict
maybeAuthId = defaultMaybeAuthId -- with the result of 'maybeAuth'. As a result, it is recommended that you
-- use 'maybeAuthId' instead.
--
-- See https://github.com/yesodweb/yesod/issues/486 for more information.
--
-- Since 1.2.0
maybeAuthIdRaw :: HandlerT master IO (Maybe (AuthId master))
maybeAuthIdRaw = defaultMaybeAuthId
credsKey :: Text credsKey :: Text
credsKey = "_ID" credsKey = "_ID"
-- | Retrieves user credentials from the session, if user is authenticated. -- | Retrieves user credentials from the session, if user is authenticated.
-- --
-- This function does /not/ confirm that the credentials are valid, see
-- 'maybeAuthIdRaw' for more information.
--
-- Since 1.1.2 -- Since 1.1.2
defaultMaybeAuthId :: YesodAuth master defaultMaybeAuthId :: YesodAuth master
=> HandlerT master IO (Maybe (AuthId master)) => HandlerT master IO (Maybe (AuthId master))
@ -187,7 +198,7 @@ setCreds doRedirects creds = do
getCheckR :: AuthHandler master TypedContent getCheckR :: AuthHandler master TypedContent
getCheckR = lift $ do getCheckR = lift $ do
creds <- maybeAuthId creds <- maybeAuthIdRaw
defaultLayoutJson (do defaultLayoutJson (do
setTitle "Authentication Status" setTitle "Authentication Status"
toWidget $ html' creds) (return $ jsonCreds creds) toWidget $ html' creds) (return $ jsonCreds creds)
@ -233,6 +244,26 @@ handlePluginR plugin pieces = do
[] -> notFound [] -> notFound
ap:_ -> apDispatch ap method pieces ap:_ -> apDispatch ap method pieces
-- | Retrieves user credentials, if user is authenticated.
--
-- This is an improvement upon 'maybeAuthIdRaw', in that it verifies that the
-- credentials are valid. For example, if a user logs in, receives an auth ID
-- in his\/her session, and then the account is deleted, @maybeAuthIdRaw@ would
-- still return the old ID, whereas this function would not.
--
-- Since 1.2.0
maybeAuthId :: ( YesodAuth master
, PersistMonadBackend (b (HandlerT master IO)) ~ PersistEntityBackend val
, b ~ YesodPersistBackend master
, Key val ~ AuthId master
, PersistStore (b (HandlerT master IO))
, PersistEntity val
, YesodPersist master
, Typeable val
)
=> HandlerT master IO (Maybe (AuthId master))
maybeAuthId = fmap (fmap entityKey) maybeAuth
maybeAuth :: ( YesodAuth master maybeAuth :: ( YesodAuth master
, PersistMonadBackend (b (HandlerT master IO)) ~ PersistEntityBackend val , PersistMonadBackend (b (HandlerT master IO)) ~ PersistEntityBackend val
, b ~ YesodPersistBackend master , b ~ YesodPersistBackend master
@ -243,7 +274,7 @@ maybeAuth :: ( YesodAuth master
, Typeable val , Typeable val
) => HandlerT master IO (Maybe (Entity val)) ) => HandlerT master IO (Maybe (Entity val))
maybeAuth = runMaybeT $ do maybeAuth = runMaybeT $ do
aid <- MaybeT $ maybeAuthId aid <- MaybeT $ maybeAuthIdRaw
a <- MaybeT a <- MaybeT
$ fmap unCachedMaybeAuth $ fmap unCachedMaybeAuth
$ cached $ cached
@ -255,7 +286,20 @@ maybeAuth = runMaybeT $ do
newtype CachedMaybeAuth val = CachedMaybeAuth { unCachedMaybeAuth :: Maybe val } newtype CachedMaybeAuth val = CachedMaybeAuth { unCachedMaybeAuth :: Maybe val }
deriving Typeable deriving Typeable
requireAuthId :: YesodAuth master => HandlerT master IO (AuthId master) -- | Similar to 'maybeAuthId', but redirects to a login page if user is not
-- authenticated.
--
-- Since 1.1.0
requireAuthId :: ( YesodAuth master
, PersistMonadBackend (b (HandlerT master IO)) ~ PersistEntityBackend val
, b ~ YesodPersistBackend master
, Key val ~ AuthId master
, PersistStore (b (HandlerT master IO))
, PersistEntity val
, YesodPersist master
, Typeable val
)
=> HandlerT master IO (AuthId master)
requireAuthId = maybeAuthId >>= maybe redirectLogin return requireAuthId = maybeAuthId >>= maybe redirectLogin return
requireAuth :: ( YesodAuth master requireAuth :: ( YesodAuth master

View File

@ -189,7 +189,7 @@ postLoginR = do
getPasswordR :: YesodAuthEmail master => HandlerT Auth (HandlerT master IO) RepHtml getPasswordR :: YesodAuthEmail master => HandlerT Auth (HandlerT master IO) RepHtml
getPasswordR = do getPasswordR = do
maid <- lift maybeAuthId maid <- lift maybeAuthIdRaw
pass1 <- newIdent pass1 <- newIdent
pass2 <- newIdent pass2 <- newIdent
case maid of case maid of
@ -228,7 +228,7 @@ postPasswordR = do
when (new /= confirm) $ do when (new /= confirm) $ do
lift $ setMessageI Msg.PassMismatch lift $ setMessageI Msg.PassMismatch
redirect setpassR redirect setpassR
maid <- lift maybeAuthId maid <- lift maybeAuthIdRaw
aid <- case maid of aid <- case maid of
Nothing -> do Nothing -> do
lift $ setMessageI Msg.BadSetPass lift $ setMessageI Msg.BadSetPass

View File

@ -192,7 +192,7 @@ getAuthIdHashDB :: ( YesodAuth master, YesodPersist master
-> Creds master -- ^ the creds argument -> Creds master -- ^ the creds argument
-> HandlerT master IO (Maybe (AuthId master)) -> HandlerT master IO (Maybe (AuthId master))
getAuthIdHashDB authR uniq creds = do getAuthIdHashDB authR uniq creds = do
muid <- maybeAuthId muid <- maybeAuthIdRaw
case muid of case muid of
-- user already authenticated -- user already authenticated
Just uid -> return $ Just uid Just uid -> return $ Just uid