2015-12-12 130 views
7

我有以下春季安全代码,但它不起作用。当我打开登录页面并输入[email protected]/secret的用户名/密码时,将显示以下错误消息。一旦输入用户名/密码后,将被添加到地址?error=1,即使我手动删除并刷新页面消息不会。控制台中没有任何显示。甚至在提交表格之前,Spring-security显示'Bad Credentials'

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="[email protected]" password="secret" 
       authorities="ROLE_ADMIN"/> 
      <user name="[email protected]" 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. 
+1

我注意到,你的拒绝访问页面是'/ notFound.jsp' - 所以,你真的确定你有一个禁止访问的问题,而不是资源未找到,问题吗? – Ralph

+1

@Ralph我不确定,它显示错误消息的页面。我不知道是什么问题 –

+1

首先创建否认页面的独立访问,然后你就可以在'弹簧安全配置它们:http'标签 – Ralph

回答

5

你需要允许所有人访问你的页面/signin,即使他没有被认证。即使提交表单之前“春安显示‘不正确的凭据’:

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

我写这个答案的问题是改变了第一次使用前,在一个时间,问题是(它仍然是冠军) “

+0

我补充说,但它显示相同的错误。 –

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


<user name="[email protected]" password="secret" authorities="ROLE_USER"/> 

以上CONFIGS有两个不同的角色名称ROLE_MEMBERROLE_USER

UPDATE

由于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> 

希望下面的变化这有助于

+0

谢谢,你会详细说明一些变化吗? –

+0

我认为该请求被拒绝是因为url无法解析。它有用吗? –

+0

不,当我点击链接去/登录?错误= 1多数民众赞成在奇怪! –

2

SPRING_SECURITY_LAST_EXCEPTION停留在会议上,即使你刷新页面。你需要检查的error参数:

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

我猜你的登录控制器的方法是做redirectforward,然后试图发送HTTP GET请求以作为查询参数的用户名和密码登录URL。通常认为将凭据作为URL参数发送是不好的做法,这就是为什么不允许。应该发送HTTP POST来代替。 如果您想要留在GET,您可以通过使用请求包装来绕过支票,该请求包装将返回HTTP POST而不是HTTP GET代表getMethod

从@tharingu_DG

更新答案应该工作,但它仍然是技术上相当于发送因为任何人谁偷了它可以用它来验证加密身份验证凭据。

相关问题