3

我正在尝试使用 SmartGWT 创建一个登录页面,并且一直在尝试让表单身份验证与嵌入了 Eclipse 的 GWT 插件的 Jetty 服务器一起使用。我有一个使用 TextItems 获取用户名和密码的页面,然后一旦按下登录按钮,我就需要进行身份验证。

我已经设置了我的 jetty-web.xml 文件来创建一个自定义领域,它目前什么都不做,只是告诉我它的方法正在被调用,所以我知道它正在工作,因为一旦我进入那里,我很漂亮当然我可以弄清楚其余的。

码头-web.xml

<Configure class="org.mortbay.jetty.webapp.WebAppContext">
    <Get name="SecurityHandler">
        <Call name="setUserRealm">
            <Arg>
                <New class="custom.realm.CustomRealm">
                    <Set name="name">CustomRealm</Set>
                </New>
            </Arg>
        </Call>

        <Call name="setAuthenticator">
            <Arg>
                <New class="org.mortbay.jetty.security.FormAuthenticator">
                    <Set name="loginPage">/login.html</Set>
                    <Set name="errorPage">/login.html</Set>
                </New>
            </Arg>
        </Call>
    </Get>
</Configure>

[编辑 05/18 下午 1:16]

我的 CustomRealm 扩展了 Jetty 的 HashUserRealm,不知道这是否会导致问题,但我想我也会提到它。

我还在 web.xml 文件中设置了安全约束

web.xml 片段

<security-constraint>
    <web-resource-collection>        
        <web-resource-name>Login</web-resource-name>
        <url-pattern>/*</url-pattern>
    </web-resource-collection>
    <!-- <auth-constraint>
        <role-name>*</role-name>
    </auth-constraint> -->

</security-constraint>

<login-config>
    <auth-method>FORM</auth-method>
    <realm-name>CustomRealm</realm-name>
    <form-login-config>
        <form-login-page>/login.html</form-login-page>
        <form-error-page>/login.html</form-login-page>
    </form-login-config>
</login-config>

我对做这种事情还很陌生,tbh。我不确定我是否需要约束。被注释掉是因为当我取消注释时,页面根本不会加载。

根据我的阅读,我认为使用 Jetty 的安全约束应该会弹出一个浏览器登录对话框。这不是我想要发生的事情,而且它实际上并没有。所以我不确定我在那里做错了什么。

我还在 GWT 中找到了 RequestBuilder 类,但这似乎并没有做任何我想做的事情。我需要登录按钮以某种方式在我的自定义领域中调用身份验证方法。我想知道是否有办法做到这一点?或者至少指向正确的方向,因为我一直在寻找并没有找到任何东西。

提前致谢。

[编辑 05/18 8:56am] 在彼得的建议之后添加我的 RequestBuilder 现在是如何设置的

RequestBuilder rb = new RequestBuilder(RequestBuilder.POST, "login.html");
StringBuilder postData = new StringBuilder();
postData.append(URL.encode("j_username")).append("=").append(URL.encode(getUsername()));
postData.append("&");
postData.append(URL.encode("j_password")).append("=").append(URL.encode(getPassword()));
rb.setRequestData(postData.toString());
rb.setHeader("Content-type", "application/x-www-form-urlencoded");
rb.setCallback(new RequestCallback() {
    @Override
    public void onResponseReceived(Request request, Response response)
    {
        if (response.getStatusCode() != Response.SC_OK)         
        {
            onError(request, new RequestException(response.getStatusText() + ":\n" + response.getText()));
            return;
        }

        if (response.getText().contains("Access Denied"))
        {
            Window.alert("Incorrect username or password entered. Please try again.");
        }
        else
        {
            System.out.println("IT WORKED!!!");
        }
    }

    @Override
    public void onError(Request request, Throwable exception)
    {
        Window.alert(exception.getMessage());
    }
});

try
{
    rb.send();
}
catch (RequestException e)
{
    SC.say(e.getMessage());
}

[重新更新] 如果未注释 auth-constraint,则永远不会调用 onModuleLoad 方法。任何人都知道它为什么会这样做?

4

0 回答 0