Authorization
- Restricting an action to logged-in users
- Restricting an action to logged-in admins
- Checking for Permissions
Restricting an action to logged-in users
To restrict an action to a logged-in user, use ensureIsUser
:
action PostsAction = do
ensureIsUser
posts <- query @Post |> fetch
render IndexView { .. }
When someone is trying to access the PostsAction
but is not logged-in, the browser will be redirected to the login page. After the login succeeded, the user will be redirected back to the PostsAction
.
It’s common to restrict all actions inside a controller to logged-in users only. Place the ensureIsUser
inside the beforeAction
hook to automatically apply it to all actions:
instance Controller PostsController where
beforeAction = ensureIsUser
action PostsAction = do
posts <- query @Post |> fetch
render IndexView { .. }
action ShowPostAction { postId } = do
post <- fetch postId
render ShowView { .. }
In this case PostsAction
and ShowPostAction
are only accessible to logged-in users.
Restricting an action to logged-in admins
To restrict an action to a logged-in admin, use ensureIsAdmin
instead of ensureIsUser
. If you get
error:
* Could not deduce (HasNewSessionUrl admin0)
arising from a use of `ensureIsAdmin'
[…]
These potential instance exist:
instance HasNewSessionUrl Admin -- Defined in `Admin.Types'
then you may have to annotate the type with @Admin
. For example:
instance Controller UserController where
beforeAction =
ensureIsAdmin @Admin
Checking for Permissions
You can use accessDeniedUnless
to allow certain things only for specific users. For example, to restrict a ShowPostAction
only to the user who a post belongs to, use this:
action ShowPostAction { postId } = do
post <- fetch postId
accessDeniedUnless (post.userId == currentUserId)
render ShowView { .. }