Аутентификация с помощью Jetty через кнопку GWT
Я пытаюсь создать страницу входа с помощью SmartGWT и пытаюсь заставить Form Authentication работать с сервером Jetty, встроенным в подключаемый модуль GWT для Eclipse. У меня есть страница, которая принимает имя пользователя и пароль с помощью 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 13:16]
Мой CustomRealm расширяет HashUserRealm от Jetty, не знаю, если это может вызвать проблемы, btu решил, что я упомянул бы и это.
Я также установил ограничение безопасности в моем файле 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>
Я довольно новичок в этом деле Я не уверен, что мне нужно ограничение. Это закомментировано, потому что, когда я это комментировал, страница вообще не загружалась.
Из того, что я прочитал, я понял, что при использовании ограничения безопасности с Jetty должно появиться диалоговое окно входа в браузер. Это не то, чего я хочу, и на самом деле этого не происходит. Так что я не уверен, что я там делаю неправильно.
Я также нашел класс RequestBuilder в GWT, но, похоже, он не делает ничего, что я хочу. Мне нужна кнопка входа, чтобы как-то вызвать метод authenticate в моей пользовательской области. Мне интересно, есть ли способ сделать это? Или, по крайней мере, указывать в правильном направлении, потому что я искал и ничего не нашел.
заранее спасибо.
[edit 05/18 8:56 am] добавив, как теперь настраивается мой 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());
}
[re-update] Если ограничение auth не комментируется, метод onModuleLoad никогда не вызывается. Кто-нибудь знает, почему он это делает?