вебмашина и перенаправление неаутентифицированных пользователей - PullRequest
4 голосов
/ 07 октября 2011

В моем новом проекте я хочу использовать webmachine и mochiweb. Первое, что я хочу сделать - это аутентификация.

Я редактирую "dispatch.conf" и создаю некоторые ресурсы, например:

{["auth"], my_res_auth, []}.
{["protected"], my_res_protected, []}.
{['*'], my_res_default, []}.

Когда кто-то обращается к «защищенному» ресурсу, я хочу перенаправить его на ресурс «auth», если он не вошел в систему. Ресурс «auth» содержит веб-форму с именем пользователя и паролем, он выполняет всю работу по аутентификации.

Я поместил такой код в my_res_protected.erl:

is_authorized(ReqData, State) ->
    case my_auth:is_authorized(ReqData) of
        true -> {true, ReqData, State};
        false ->
            % here should be something to redirect user to "auth" resource
            % currently i put such thing, which is incorrect:
            {true, wrq:do_redirect(true, wrq:set_resp_header("location", "/auth", ReqData)), State}
            % dont know what should i put instead of "true"
    end.

Я прогуглил какой-то пример того, как это сделать, но мне не нужно, чтобы мне пришлось помещать эту функцию во все ресурсы, что требует аутентификации.

Есть ли способ сделать это?

Ответы [ 2 ]

4 голосов
/ 07 октября 2011

я думаю, что нашел правильный путь, поместил этот код в файл auth.hrl и включил его в мои ресурсы

is_authorized(ReqData, State) ->
    case my_auth:is_authorized(ReqData) of
        true -> {true, ReqData, State};
        false ->
            % there i got address, to which should i redirect
            % this address is defined in dispatch.conf
            % and walk trough my_res_protected:init/1 into State
            case proplists:get_value(do_redirect, State, false) of
                false ->
                    {{halt, 401}, wrq:set_resp_header(
                            "Content-type", "text/plain",
                            wrq:set_resp_body("NOT AUTHORIZED", ReqData)
                        ), State};
                Location ->
                    {{halt, 302}, wrq:set_resp_header("Location", Location, ReqData), State}
            end
    end.
0 голосов
/ 11 апреля 2013

В случае, если вы не авторизованы и do_redirect неверно, почему бы просто не вернуть { false, ReqData, State }, как ожидает веб-машина для is_authorized(), вместо того, чтобы создавать ответ самостоятельно?

...