Spring Security-自定义登录表单在提交时不调用AuthenticationProvider

Spring Security-自定义登录表单在提交时不调用AuthenticationProvider,spring,security,login,authenticator,Spring,Security,Login,Authenticator,已解决: SpringSecurity4似乎不再提供默认的登录处理url。我们现在必须以如下形式显式地提供它 login-processing-url="/j_spring_security_check" 我有一种奇怪的行为组合,这让我感到困惑。找到了很多教程和类似的问题,但没有一个完全像这样。我希望有人能帮忙 Short version:重新显示登录页面-无论用户名/密码是好是坏,都不会调用AuthenticationProvider(断点未触发) 长版本: 步骤1-成功 我能够将spr

已解决

SpringSecurity4似乎不再提供默认的登录处理url。我们现在必须以如下形式显式地提供它

login-processing-url="/j_spring_security_check"

我有一种奇怪的行为组合,这让我感到困惑。找到了很多教程和类似的问题,但没有一个完全像这样。我希望有人能帮忙

Short version:重新显示登录页面-无论用户名/密码是好是坏,都不会调用AuthenticationProvider(断点未触发)

长版本

步骤1-成功

  • 我能够将spring安全性与默认的AuthenticationProvider和默认的自动生成登录屏幕一起使用。好
  • 我能够编写自定义的AuthenticationProvider和UserDetailsService。使用默认的自动生成的登录屏幕,一切正常。好
  • 。。。所以以上排除了很多可能的问题
步骤2-问题-设置为使用自定义登录表单

1) 我添加了表单登录:

<sec:form-login 
login-processing-url="/j_spring_security_check"
login-page="/login.htm"
authentication-failure-url="/login.htm?error" 
username-parameter="username"
password-parameter="password" 
/>
<sec:logout logout-success-url="/login.htm?logout"/>
<sec:csrf/>
4) 我创建了一个简单的login.jsp:

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<html>
<head>
<title>Login</title>
</head>
<body onload="document.loginForm.username.focus()">
  <h1>Login form</h1>
  <div>
    <h2>Username and Password</h2>
    <c:if test="${not empty error}">
      <div style="color: red">${error}</div>
    </c:if>
    <c:if test="${not empty msg}">
      <div style="color: green">${msg}</div>
    </c:if>

    <form name="loginForm" action="<c:url value='j_spring_security_check' />" method='POST'>
      <table>
        <tr>
          <td>User:</td>
          <td><input type='text' name='username' value = '' /></td>
        </tr>
        <tr>
          <td>Password:</td>
          <td><input type='password' name='password' /></td>
        </tr>
        <tr>
          <td colspan='2'><input name="submit" type="submit" value="submit" /></td>
        </tr>
        <tr><td colspan='2'>[${not empty webUser}]</td></tr>
      </table>
      <input type="hidden" name="${_csrf.parameterName}" value="${_csrf.token}" />
    </form>
  </div>
</body>
</html>

登录
登录表格
用户名和密码
${error}
${msg}
用户:
密码:
[${不是空的webUser}]
5) 然后我在Eclipse中设置了一些断点,以查看它的行为

  • 登录页面显示良好
  • 我输入用户名和密码并点击提交
  • 好的或坏的用户名和密码都会导致相同的行为,即重新显示登录页面
  • AuthenticationProvider中的断点永远不会被触发
我的解释是,指定的操作没有触发AuthenticationProvider

请注意,当我使用内置的默认spring安全登录表单时,同一个自定义AuthenticationProvider工作得非常完美。这告诉我问题与提供者本身无关,而是当我在login.jsp中点击submit时“到达它”,特别是因为我在它的第一行上有一个断点,并且它没有被绊倒


我打赌我的错误对于熟悉SpringSecurity的人来说是微不足道的。我要提前向所有抓到它的人表示感谢。

这个问题已经解决了

SpringSecurity4似乎不再提供默认的登录处理url。我们现在必须以如下形式显式地提供它

login-processing-url="/j_spring_security_check"
登录处理url=“/j_spring_security_check”


我的头撞在墙上好几个小时后,我偶然发现了解决办法。我希望这对其他处于同样情况的人有所帮助。

这个问题已经解决了

SpringSecurity4似乎不再提供默认的登录处理url。我们现在必须以如下形式显式地提供它

login-processing-url="/j_spring_security_check"
登录处理url=“/j_spring_security_check”

我的头撞在墙上好几个小时后,我偶然发现了解决办法。我希望这对其他处于同样情况的人有所帮助