Spring-security展示了“Bad Credentials'甚至在提交表格之前

时间:2015-12-12 09:26:49

标签: java spring spring-security

我有以下春季安全代码,但它不起作用。当我打开登录页面并输入admin@myproject.com / secret的用户名/密码时,将显示以下错误消息。输入用户名/密码后,将其添加到地址?error=1,即使我手动删除它并刷新页面消息也不会。控制台中没有显示任何内容。

Your login attempt was not successful due to

Bad credentials.

弹簧security.xml文件

<beans:beans xmlns="http://www.springframework.org/schema/security"
    xmlns:beans="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
    http://www.springframework.org/schema/security
    http://www.springframework.org/schema/security/spring-security-3.2.xsd">



    <beans:import resource='login-service.xml' />
    <http auto-config="true" access-denied-page="/notFound.jsp"
        use-expressions="true">
        <intercept-url pattern="/" access="permitAll" />
        <intercept-url pattern="/member**" access="hasRole('ROLE_MEMBER')" />
        <form-login login-page="/signin" default-target-url="/index"
            authentication-failure-url="/signin?error=1" />

        <logout logout-success-url="/login?logout" />
        <csrf />
    </http>
    <authentication-manager>
        <authentication-provider>
            <user-service> <user name="admin@myproject.com" password="secret" 
                authorities="ROLE_ADMIN"/> 
            <user name="user@yahoo.com" password="secret" authorities="ROLE_USER"/> 
                </user-service> 

        </authentication-provider>
    </authentication-manager>
</beans:beans>

表单包含以下代码,即使在提交表单之前,SPRING_SECURITY_LAST_EXCEPTION似乎也不为空。

<c:if test="${not empty SPRING_SECURITY_LAST_EXCEPTION}">
            <font color="red"> Your login attempt was not successful due
                to <br />
            <br /> <c:out value="${SPRING_SECURITY_LAST_EXCEPTION.message}" />.
            </font>
        </c:if>
            <form id="form-login" role="form" method="post"
                        action="<c:url value='/j_spring_security_check' />"
                        class="relative form form-default">
                        <input type="hidden" name="${_csrf.parameterName}"
                            value="${_csrf.token}" />

我不知道为什么,但相同的代码现在返回以下错误

Your login attempt was not successful due to

Authentication method not supported: GET. 

4 个答案:

答案 0 :(得分:5)

您需要允许所有人访问您的/signin页面,即使他未经过身份验证。

<intercept-url pattern="/signin" access="permitAll" />

我在第一次更改问题之前写了这个答案,在问题出现的时候(它仍然是标题):“Spring-security在提交表单之前显示'Bad Credentials'”< / em>的

答案 1 :(得分:3)

<intercept-url pattern="/member**" access="hasRole('ROLE_MEMBER')" />


<user name="user@yahoo.com" password="secret" authorities="ROLE_USER"/>

以上配置有两个不同的角色名称 ROLE_MEMBER ROLE_USER

<强>更新

Authentication method not supported: GET以来,您可以尝试允许GET

<bean id="authenticationFilter" 
      class="org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter"
      p:postOnly="false" />

web.xml

还需要进行以下更改
<filter-mapping> 
    <filter-name>springSecurityFilterChain</filter-name>
    <url-pattern>/*</url-pattern>
    <dispatcher>REQUEST</dispatcher>
    <dispatcher>FORWARD</dispatcher>
</filter-mapping>

希望这有帮助

答案 2 :(得分:2)

即使刷新页面,SPRING_SECURITY_LAST_EXCEPTION也会保留在会话中。您需要检查error参数:

<c:if test="${(not empty param.error) && (not empty SPRING_SECURITY_LAST_EXCEPTION)}">

答案 3 :(得分:1)

我猜您的登录控制器方法正在执行redirectforward,然后尝试向用户名和密码作为查询参数的登录URL发送HTTP GET请求。将凭据作为URL参数发送通常被认为是不好的做法,并且这是不允许的原因。应该发送HTTP POST代替。 如果您希望继续使用GET,则可以使用请求包装器来绕过检查,该请求包装器为HTTP POST返回HTTP GET而不是getMethod

来自@tharingu_DG的更新答案应该有效,但它在技术上仍然相当于发送未加密的身份验证凭据,因为窃取它的任何人都可以使用它进行身份验证。