2015-12-12 13 views
7

Mam następujący kod dla bezpieczeństwa wiosennego, ale to nie działa. Kiedy otworzę stronę logowania i wprowadzę nazwę użytkownika/hasło, które jest [email protected]/secret, pojawi się następujący komunikat o błędzie. Po wprowadzeniu nazwy użytkownika/hasła należy dodać go do adresu ?error=1, nawet jeśli usunę go ręcznie i odświeży się komunikat strony nie zostanie wysłany. Nic nie jest wyświetlane w konsoli.Spring-security pokazuje "Złe poświadczenia" jeszcze przed przesłaniem formularza

Your login attempt was not successful due to 

Bad credentials. 

wiosna-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> 

Formularz został następujący kod, wydaje się, że nie jest pusta SPRING_SECURITY_LAST_EXCEPTION nawet przed złożeniem formularza.

<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}" /> 

nie jestem pewien dlaczego, ale te same zwroty kod następujący błąd teraz

Your login attempt was not successful due to 

Authentication method not supported: GET. 
+1

Zauważyłem, że strona z odmową dostępu to '/ notFound.jsp' - czy na pewno masz problem z odmową dostępu, ale czy problem nie występuje w zasobach? – Ralph

+1

@Ralph Nie jestem pewien, pokazuje stronę z komunikatem o błędzie. Nie jestem pewien, na czym polega problem –

+1

Najpierw utwórz osobną stronę z odmową dostępu, a następnie skonfiguruj je w tagu 'spring-security: http' tag – Ralph

Odpowiedz

5

Trzeba umożliwić wszystkim dostęp do strony /signin, nawet jeśli nie jest uwierzytelniony.

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

Napisałem tę odpowiedź, zanim sprawa została po raz pierwszy zmienił się w momencie, w którym kwestia była (jest nadal tytuł): „«zły Poświadczenia»pokazuje Wiosna-Security jeszcze przed złożeniem formularza "

+0

Dodałem, że to pokazuje ten sam błąd. –

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


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

Wyżej configs mieć dwie różne nazwy ról ROLE_MEMBER i ROLE_USER

AKTUALIZACJA

Od Authentication method not supported: GET, czy możesz spróbować pozwolić GET.

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

I następujące zmiany wymagana jest również w web.xml

<filter-mapping> 
    <filter-name>springSecurityFilterChain</filter-name> 
    <url-pattern>/*</url-pattern> 
    <dispatcher>REQUEST</dispatcher> 
    <dispatcher>FORWARD</dispatcher> 
</filter-mapping> 

nadzieję, że to pomaga

+0

dziękuję, czy opracowałbyś zmiany? –

+0

Myślałem, że prośba została odrzucona, ponieważ nie można rozwiązać adresu URL. Zadziałało? –

+0

nie, gdy kliknę link, który przechodzi do/signin? Error = 1 thats weird! –

2

The SPRING_SECURITY_LAST_EXCEPTION pozostaje w sesji nawet jeśli odśwież stronę. Trzeba sprawdzić dla parametru error:

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

Chyba metoda kontroler logowanie robi redirect lub forward, a następnie próbuje wysłać HTTP GET żądanie do adresu URL logowania z nazwą użytkownika i hasło jako parametry zapytań. Powszechnie uważa się za złą praktykę wysyłanie referencji jako parametrów URL i dlatego nie jest dozwolone. Powinien wysłać zamiast tego numer HTTP POST. Jeśli chcesz pozostać przy GET, możesz pominąć czek, używając opakowania żądania, które zwraca HTTP POST zamiast HTTP GET dla getMethod.

Zaktualizowana odpowiedź z @tharingu_DG powinna działać, ale nadal jest technicznie równoważna wysyłaniu niezaszyfrowanych danych uwierzytelniających, ponieważ każdy, kto go ukradnie, może użyć go do uwierzytelnienia.

Powiązane problemy