我有以下春季安全代码,但它不起作用。当我打开登录页面并输入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.
答案 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)
我猜您的登录控制器方法正在执行redirect
或forward
,然后尝试向用户名和密码作为查询参数的登录URL发送HTTP GET
请求。将凭据作为URL参数发送通常被认为是不好的做法,并且这是不允许的原因。应该发送HTTP POST
代替。
如果您希望继续使用GET
,则可以使用请求包装器来绕过检查,该请求包装器为HTTP POST
返回HTTP GET
而不是getMethod
。
来自@tharingu_DG的更新答案应该有效,但它在技术上仍然相当于发送未加密的身份验证凭据,因为窃取它的任何人都可以使用它进行身份验证。