Пользовательский SpnegoAuthenticator работал с Tomcat 8, но выдает 404 с Tomcat 9

#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 .