UserDetailsService pijany lub niespełna rozumu

0

Dzień dobry, mam problem z Spring Security i autoryzacją użytkownika poprzez bazę danych. Używam Spring 4, Spring Boot, Hibernate i Spring Data.
Mianowicie problem jest taki, że podając poprawne dane Spring Security uparcie odmawia mi dostępu.

Co wiem:

  • Spring Data poprawnie zwraca hasło i nazwę użytkownika.
  • W RESTAuthenticationFailureHandler widzę, że z frontendu zostało poprawnie przesłane hasło i nazwa

Konfiguracja:

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
        @Autowired
        private RESTAuthenticationEntryPoint authenticationEntryPoint;
        
        @Autowired
        private RESTAuthenticationFailureHandler authenticationFailureHandler;
        
        @Autowired
        private RESTAuthenticationSuccessHandler authenticationSuccessHandler;
    
        @Autowired
        private UserAuthService userAuthService;
        
	@Override
	protected void configure(HttpSecurity http) throws Exception {
		http
                    .csrf().disable()
                    .authorizeRequests()
                        .antMatchers("/home", "/").permitAll()	
                        .antMatchers("/login").permitAll()
                        .antMatchers("/addGame").hasRole("USER")
                    .and()
                    .exceptionHandling()
                        .authenticationEntryPoint(authenticationEntryPoint)
                    .and()
                        
                    .formLogin()
                        .successHandler(authenticationSuccessHandler)
                        .failureHandler(authenticationFailureHandler);
            
	}
       
        @Autowired
        public void configureGlobalSecurity(AuthenticationManagerBuilder auth) throws Exception {
            auth.userDetailsService(userAuthService);
        } 

UserAuthService:

import org.springframework.security.core.userdetails.User;

@Service 
public class UserAuthService implements UserDetailsService{
    @Autowired
    UserDatabaseService userDatabaseService;
    
    public UserAuthService(){
        super();
    }
    
    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
        UserEntity user = userDatabaseService.getUserByUsername(username);
        if ( user == null ){
            throw new UsernameNotFoundException(username);
        } 
        List<SimpleGrantedAuthority> grantedAuthority = new ArrayList<>();
        grantedAuthority.add( new SimpleGrantedAuthority("USER") );
        return new User(user.getUsername(), user.getPassword(), true, true,true,true, grantedAuthority );
    }

UserDatabaseService Praktycznie pobiera tylko dane przez JpaRepository i ewentualnie zamienia DTO na Entity i na odwrót. Cała implementacja została maksymalnie uproszczona, ale wciąż nie działa.

Przepraszam za tytuł, ale problem ten doprowadza mnie do szewskiej pasji, 5 dni temu założyłem o tym temat na StackOverflow, bez odzewu niestety. Szukałem na internecie odpowiedzi i znalazłem nawet podobne tematy, ale bez odpowiedzi. Za wszelką pomoc byłbym wdzięczny.

0

1.To w takim razie te UserDatabaseService nie ma żadnego sensu
2.Autowired na pola to tragedia okrutna
3.Używałeś debugera? Jeśli sa nieprawidłowe dane to poleci UsernameNotFoundException

0

@scibi92:

  1. Jeśli zapisuje usera do DB, to mam to robić przez UserAuthService? Zrobiłem to by rozdzielić manipulację bazą od autoryzacji użytkownika.
  2. Czemu? :/
  3. No racja, zapomniałem że przecież rzucam wyjątek... Więc to wyjaśnia ten problem, usuwam w takim razie to z pytania. Ale co z tym logowaniem?
0

Jak masz hash'owe hasła w bazie, jaki algorytmem, domyślnie bcrypt jest w spring

0

1.Ja bym zrobił jedną klase która implentowałaby UserAuthService i tyle, Tam wywołbym UserRepository
2.Jesli nie wiesz czemu to powinienec wrócić do nauki progmramowania obiektowego a nie w Springu webówką się zajmować

0

@Szczery:
Miałem wcześniej BCryptem, od tego własnie się zaczęło bo w ogóle nie rozpoznawało mi haseł. Teraz nie ma żadnego, dane w bazie są zapisywane na "czysto".

@scibi92:

  1. Ok.
  2. Ok :). Uwielbiam gdy ktoś się pyta na tym forum "czemu", a zamiast odpowiedzi dostaje enigmatyczne "bo tak a ty jesteś głupi". Jeśli pojawiające się wielokrotnie w książkach i tutorialach @ Autowired na polach jest złe, to jestem po prostu ciekaw czemu.
2
AndrzejAd napisał(a):
  1. Ok :). Uwielbiam gdy ktoś się pyta na tym forum "czemu", a zamiast odpowiedzi dostaje enigmatyczne "bo tak a ty jesteś głupi". Jeśli pojawiające się wielokrotnie w książkach i tutorialach @ Autowired na polach jest złe, to jestem po prostu ciekaw czemu.

http://olivergierke.de/2013/11/why-field-injection-is-evil/

Jak to ostatnio kolega napisał (proponowałem, żeby dodał ten temat do artykułu) - to jest tak jasne, że sie nawet już nie dyskutuje.

W książkach wiele rzeczy jest napisane, a połowa przykładów otwiera scyzoryk w kieszeni - norma.

0
jarekr000000 napisał(a):
AndrzejAd napisał(a):
  1. Ok :). Uwielbiam gdy ktoś się pyta na tym forum "czemu", a zamiast odpowiedzi dostaje enigmatyczne "bo tak a ty jesteś głupi". Jeśli pojawiające się wielokrotnie w książkach i tutorialach @ Autowired na polach jest złe, to jestem po prostu ciekaw czemu.

http://olivergierke.de/2013/11/why-field-injection-is-evil/

Jak to ostatnio kolega napisał (proponowałem, żeby dodał ten temat do artykułu) - to jest tak jasne, że sie nawet już nie dyskutuje.

W książkach wiele rzeczy jest napisane, a połowa przykładów otwiera scyzoryk w kieszeni - norma.

Dzięki za link, poczytałem o problemie i przybliżyło mi to sytuację, rzeczywiście nie wygląda to na dobrą praktykę. No ale kurde nawet w oficjalnej dokumentacji Springa jest to powszechne używane... Widać oni też nie znają podstaw OOP :).

1
AndrzejAd napisał(a):
jarekr000000 napisał(a):

Dzięki za link, poczytałem o problemie i przybliżyło mi to sytuację, rzeczywiście nie wygląda to na dobrą praktykę. No ale kurde nawet w oficjalnej dokumentacji Springa jest to powszechne używane... Widać oni też nie znają podstaw OOP :).

Podstawy znają i to nawet dobrzy programiści, niestety żyją z propgagowania syfu i nie bardzo mogą coś z tym zrobić. Pecunia non olet.

0

Widać UserService ani nie był pijany ani nie był niespełna rozumu.

Problem był taki, że DB oprócz hasła zwracała jeszcze puste znaki na końcu przez co hasła nigdy się nie zgadzały. Nie wiem czy się śmiać czy płakać, że spędziłem nad tym tyle czasu, myśląc że problem jest w konfiguracji.

1 użytkowników online, w tym zalogowanych: 0, gości: 1