在 Tomcat 上拦截 j_security_check 以在 Struts 2 中将用户名修改为 LDAP

Posted

技术标签:

【中文标题】在 Tomcat 上拦截 j_security_check 以在 Struts 2 中将用户名修改为 LDAP【英文标题】:Intercepting j_security_check on Tomcat to modify username for passion to LDAP in Struts 2 【发布时间】:2021-09-11 17:16:53 【问题描述】:

我需要修改登录表单上的用户名,然后才能将其传递到 LDAP 进行身份验证。 应用程序是基于struts的。在将 j_username 传递给 LDAP 之前,我需要删除一些字符。最好的方法是什么,javascript 或在 Struts 中编写过滤器或拦截器?我们可以在发送到j_security_check之前发出登录请求来过滤吗?

以下是详细信息:

login.jsp:

<form name="loginForm" method="POST" action='<%= response.encodeURL("j_security_check") %>'>
<table>
<tr><td>User Name</td><td><input type="text" name="j_username" size="10" maxlength="30"></td></tr>
<tr><td>Password</td><td><input type="password" name="j_password" size="10" maxlength="30"></td></tr>
<tr><td>&nbsp;</td><td><input type="submit" value="Login" name="j_security_check"></td></td></tr>
</table>
</form>

web.xml:

<login-config>
        <auth-method>FORM</auth-method>
        <realm-name>Form-Based Authentication Area</realm-name>
        <form-login-config>
          <!--  form-login-page>/login.jsp</form-login-page -->
          <form-login-page>/WEB-INF/login.jsp</form-login-page>
          <form-error-page>/WEB-INF/login.jsp?result=false</form-error-page>
        </form-login-config>
    </login-config>

context.xml:

 <Realm className="org.apache.catalina.realm.JNDIRealm"
         allRolesMode="authOnly"
         connectionURL="ldap://localhost:9002"
         connectionName="CN..."
         connectionPassword=""
         userPattern="--"/>

【问题讨论】:

【参考方案1】:

表单操作j_security_check 在调用任何过滤器之前由服务器处理。所以你不能在 Struts 2 中拦截它。

如果需要修改一些随请求传递的参数,可以将表单动作设置为Struts动作。一旦调用了 Struts 操作,您将获得 ActionContext 中的所有参数。您可以编写自定义拦截器并将其添加到操作配置中。

拦截器可以返回结果以重定向到j_security_check,并带有您已经修改的参数。

【讨论】:

以上是关于在 Tomcat 上拦截 j_security_check 以在 Struts 2 中将用户名修改为 LDAP的主要内容,如果未能解决你的问题,请参考以下文章

Tomcat安装后,远程IP无法访问的问题。

拦截器与文件上传

使用Tomcat7插件启动报错

如何在Spring Boot属性中设置Tomcat的SlowQueryReport拦截器的阈值

SpringBoot拦截器和 Servlet3.0自定义FilterListener

如何在 spring-boot 中拦截嵌入式 Tomcat 上的“全局”404