Custom SpnegoAuthenticator与Tomcat 8配合使用,但与Tomcat 9配合使用时提供了40



Project是使用表单身份验证与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
}
}

这在Tomcat8中运行良好,身份验证发生在localhost/application/j_security_check。但是在Tomcat 9.0.20中部署它之后,它开始向localhost/application/j_security_check提供404,尽管在CustomeSpnegoAuthenticator.javaformAuthenticator的状态是startedconf/context.xmlconf/web.xmlwebapps/application/WEB-INF/web.xml是相同的。只有Tomcat版本不同。

有人知道可能是什么原因吗?或者我该如何进一步调试?

因此,在阅读源代码后,我发现Tomcat 9中验证器的实现与Tomcat 8有点不同。他们用doAuthenticate取代了authenticate

因此,解决方案是在文件CustomeSpnegoAuthenticator.java中,将覆盖函数从authenticate更改为doAuthenticate。因为这条线:formAuthenticator.setLandingPage("/home");。在文件login.jsp中,操作应为home/j_security_check

相关内容

  • 没有找到相关文章

最新更新