4

在我的新项目中,我想使用 webmachine 和 mochiweb。我要做的第一件事是身份验证。

我编辑“dispatch.conf”并制作一些资源,例如:

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

当某人访问“受保护”资源时,如果他未登录,我想将他重定向到“auth”资源。“auth”资源包含带有用户名和密码的 Web 表单,它可以完成所有身份验证工作。

我将这样的代码放在 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.

我用谷歌搜索了一些如何做的例子,但不喜欢我应该把这个函数放在所有资源中,这需要身份验证。

有什么办法吗?

4

2 回答 2

4

我想我找到了正确的方法,将此代码放入 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.
于 2011-10-07T14:50:19.083 回答
0

在您未授权且do_redirect为假的情况下,为什么{ false, ReqData, State }不像 webmachine 期望的那样返回is_authorized(),而不是自己构建响应?

于 2013-04-11T11:41:30.897 回答