• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Logowanie za pomocą Spring Security

VMware Cloud PRO - przenieś swoją infrastrukturę IT do chmury
0 głosów
1,412 wizyt
pytanie zadane 1 kwietnia 2017 w Java przez Jonki Dyskutant (8,180 p.)
edycja 1 kwietnia 2017 przez Jonki

Próbuję stworzyć system logowania za pomocą Spring Security, lecz napotkałem pewien problem. Problem jest w miejscu

<authentication-manager>
        <authentication-provider>
            <jdbc-user-service data-source-ref="dataSource"
                               users-by-username-query=
                                       "SELECT Username, Password FROM users WHERE Username=?"
                               authorities-by-username-query=
                                       "SELECT Username, ‘ROLE_USER’ FROM users WHERE Username=?"/>
        </authentication-provider>
</authentication-manager>

podczas logowania wyrzuca mi błędy

01-Apr-2017 20:34:32.108 SEVERE [http-nio-8080-exec-6] org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter.doFilter An internal error occurred while trying to authenticate the user.
 org.springframework.security.authentication.InternalAuthenticationServiceException: For input string: "myPassword"

właśnie 'myPassword' to jest hasło do konta. Jak błędnie wpisuję jakieś dane to jest OK, ale jak wpiszę poprawne dane do zalogowania to wywala taki błąd i przechodzi na zadeklarowany

authentication-failure-url="/error"

W bazie użytkownicy mają pola ID, Username, Email, Password, ROLE_USER

Konfiguracja spring-security

<b:beans xmlns="http://www.springframework.org/schema/security"
         xmlns:b="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.xsd
						http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security.xsd">
    <b:import resource="applicationContext.xml" />

    <http auto-config="true" use-expressions="true">
        <form-login login-page="/login"
                    default-target-url="/loginSuccessfully"
                    authentication-failure-url="/AA"
                    username-parameter="username"
                    password-parameter="password"/>
        <logout logout-success-url="/login"/>
        <csrf />
    </http>

    <authentication-manager>
        <authentication-provider>
            <jdbc-user-service data-source-ref="dataSource"
                               users-by-username-query=
                                       "SELECT Username, Password, Email FROM users WHERE Username=?"
                               authorities-by-username-query=
                                       "SELECT Username, ‘ROLE_USER’ FROM users WHERE Username=?"/>
        </authentication-provider>
    </authentication-manager>

</b:beans>

https://zapodaj.net/86ca500b9e96f.png.html

No i wysyłka formularza https://pastebin.com/UPwWZ11t

1 odpowiedź

0 głosów
odpowiedź 1 kwietnia 2017 przez Mateusz51 Nałogowiec (28,180 p.)
Jeśli korzystasz z standardwego rozwiazania spring security to zapytanie users-by-username-query= powinna zwracać w tej kolejnosci username, password, active (które to 1 gdy uzytkownik jest aktywny i 0 gdy nie) i tylko tyle
komentarz 1 kwietnia 2017 przez Jonki Dyskutant (8,180 p.)
Czyli w tym poleceniu 'Email' muszę zamienić na 'enabled' i w nowej tak utworzonej kolumnie trzymać wartości 0 lub 1? Ma to znaczenie czy 'Username' zaczyna się z dużej litery czy nie?
komentarz 1 kwietnia 2017 przez Mateusz51 Nałogowiec (28,180 p.)
Pierwsze tak. Możesz na sztywno ustalić że to jeden i wpisac poprostu w kwerende.

Drugie, szczerze powiedziawszy nie pamietam. Możesz zawsze w kwerendzie wpisać zapytanie ktore wyszukuje niezalenie od wielkosci liter
komentarz 1 kwietnia 2017 przez Jonki Dyskutant (8,180 p.)

Wygląda to u mnie teraz tak 

<authentication-manager>
        <authentication-provider>
            <jdbc-user-service data-source-ref="dataSource"
                               users-by-username-query=
                                       "SELECT username, password, enabled FROM users WHERE username=?"
                               authorities-by-username-query=
                                       "SELECT username, ‘ROLE_USER’ FROM users WHERE username=?"/>
        </authentication-provider>
    </authentication-manager>

w pewnym sensie polecenie się wykonuje, bo już nie wyrzuca żądnych błędów. Za to podczas logowania poprawnymi danymi również przenosi mnie na stronę na którą przekierowuje po błędnym zalogowaniu.  

authentication-failure-url="/error"

Poradnik przerabiam z http://kobietydokodu.pl/16-2-zabezpieczanie-aplikacji-z-uzyciem-spring-security/ i tutaj w poleceniu przy kolumnie 'ROLE_USER' są te dziwne apostrofy w różne strony. O co z tym chodzi? W tej kolumnie musi być jakaś specjalna wartość?

komentarz 1 kwietnia 2017 przez Mateusz51 Nałogowiec (28,180 p.)
Poprostu taka konwencja graficzna. To pole powino opisywać jaką role ma uzytkownik i moze byc dowolnym stringiem.
komentarz 1 kwietnia 2017 przez Jonki Dyskutant (8,180 p.)
Po poprawnym zalogowaniu wraca mi na stronę /login, a powinno przejść na /loginSuccessfully. Wiesz gdzie mam błąd?
komentarz 1 kwietnia 2017 przez Mateusz51 Nałogowiec (28,180 p.)
Nie zabardzo. Może w kontrolerze do /loginSuccessfully masz przekierowanie do login??
komentarz 1 kwietnia 2017 przez Jonki Dyskutant (8,180 p.)
Dobra, już mam. Jeszcze takie pytanko. Po takim prawidłowym zalogowaniu się, powinienem pobrać dane dla użytkownika o tej nazwie i przechowywać jego obiekt w sesji? 'SecurityContextHolder.getContext().getAuthentication().getPrincipal()' daje mi tylko jego nazwę, więc raczej muszę sobie samemu pobrać takiego użytkownika.
komentarz 1 kwietnia 2017 przez Mateusz51 Nałogowiec (28,180 p.)
Ja u siebie pobierałem użytkownika właśnie na bazie jego nazwy

Podobne pytania

0 głosów
0 odpowiedzi 248 wizyt
pytanie zadane 3 sierpnia 2017 w Java przez Jonki Dyskutant (8,180 p.)
+1 głos
0 odpowiedzi 353 wizyt
0 głosów
2 odpowiedzi 648 wizyt

93,440 zapytań

142,431 odpowiedzi

322,679 komentarzy

62,802 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

...