2015-12-12 64 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

更新答案應該工作,但它仍然是技術上相當於發送因爲任何人誰偷了它可以用它來驗證加密身份驗證憑據。

相關問題