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

Logowanie za pomocą Spring Security

Object Storage Arubacloud
0 głosów
1,156 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 195 wizyt
pytanie zadane 3 sierpnia 2017 w Java przez Jonki Dyskutant (8,180 p.)
+1 głos
0 odpowiedzi 290 wizyt
0 głosów
2 odpowiedzi 521 wizyt

92,576 zapytań

141,426 odpowiedzi

319,652 komentarzy

61,961 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.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...