-
Notifications
You must be signed in to change notification settings - Fork 68
Description
I'm not sure if there's a bug here or if I'm doing something wrong.
We have a fairly basic custom security handler for access control. Here's the init function:
init(_Config, State) ->
Module = wf_context:page_module(),
case check_access(Module) of
allowed -> ok;
login_required ->
% use login template to prevent rendering the protected template briefly
% TODO it still seems like we should not have to do this
wf_context:page_module(web_login),
wf:redirect_to_login("/login");
not_allowed ->
wf_context:page_module(web_404),
wf_context:path_info([])
end,
{ok, State}.
As the comment says, we've found that if we don't change the page_module to something innocuous, the protected template will still render, allowing it to be visible in a brief flash before the redirect to login. (Or, in some cases, allowing it to crash, if it's expecting session data to exist.)
I found this ancient StackOverflow example, in which a user advises a custom security handler "Instead of having the main/0 logic you describe in each of your page handlers". The example code provided simply calls redirect_to_login without otherwise changing the state. I did also try setting a status code of 401, resulting in the server happily rendering the entire protected template, with a 401 status code.
It's my impression that with a custom security handler, we shouldn't have to double-check for access in the main function of every page handler. What am I missing? Is there a better workaround than setting a dummy page handler? Or perhaps some way to cancel the in-progress page load and immediately execute the redirect?