maybeAuthId checks that ID is valid #486
This commit is contained in:
parent
f3b459e9ce
commit
b5a1d76a40
@ -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
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user