#java #tomcat #forms-authentication #tomcat9 #spnego
#java #tomcat #формы-аутентификация #tomcat9 #spnego
Вопрос:
Проект был разработан с помощью Jetty с использованием аутентификации формы. Файл login.jsp
<form method="post" action="j_security_check">
<input type="text" name="j_username"/>
<input type="password" name="j_password"/>
<input type="submit" value="Login"/>
</form>
В производстве он был опубликован в Tomcat 8.0.53 и с использованием пользовательского SpnegoAuthenticator
. Файл conf/context.xml
<Context>
<Valve className="com.CustomeSpnegoAuthenticator" />
</Context>
Файл tomcat/application/WEB-INF/web.xml
включает в себя:
<login-config>
<auth-method>SPNEGO</auth-method>
<realm-name>REALMNAME</realm-name>
<form-login-config>
<form-login-page>/login.jsp</form-login-page>
<form-error-page>/loginError.jsp</form-error-page>
</form-login-config>
</login-config>
в файле CustomeSpnegoAuthenticator.java
инициализируется и настраивается FormAuthenticator, как показано ниже
public class CustomeSpnegoAuthenticator extends org.apache.catalina.authenticator.SpnegoAuthenticator {
private FormAuthenticator formAuthenticator = new FormAuthenticator();
@Override
public void setContainer(Container container) {
try {
super.setContainer(container);
formAuthenticator.setContainer(container);
formAuthenticator.setLandingPage("/home");
formAuthenticator.start();
log.info("formAuthenticator state: " formAuthenticator.getState())
} catch (LifecycleException ex) {
log.error("Failed to start authenticators, reason: " ex.getMessage(), ex);
}
}
@Override
protected String getAuthMethod() {
return Constants.SPNEGO_METHOD;
}
@Override
public boolean authenticate(Request request, HttpServletResponse response) throws IOException {
// process username and password
// return result
}
}
Это хорошо работало в Tomcat 8, аутентификация происходит в localhost/application/j_security_check
. Но после его развертывания в Tomcat 9.0.20 он начинает выдавать 404 localhost/application/j_security_check
, хотя CustomeSpnegoAuthenticator.java
состояние formAuthenticator равно started
. conf/context.xml
, conf/web.xml
, webapps/application/WEB-INF/web.xml
одинаковы. Отличается только версия Tomcat.
У кого-нибудь есть идеи, в чем может быть причина, или как я могу продолжить отладку?
Комментарии:
1. Я не вижу здесь никакого SPNEGO.
Ответ №1:
Итак, после прочтения исходного кода я обнаружил, что реализация аутентификаторов в Tomcat 9 немного отличается от Tomcat 8. Они заменили authenticate
на doAuthenticate
.
Итак, решение находится в файле CustomeSpnegoAuthenticator.java
, измените функцию переопределения с authenticate
на doAuthenticate
. И из-за этой строки: formAuthenticator.setLandingPage("/home");
. В файле login.jsp
должно быть действие home/j_security_check
.