Próbuję przeprowadzić uwierzytelnianie z aplikacji na Androida. Zasadniczo wysyłam nazwę użytkownika i hasło (niezakodowane) do mojego punktu końcowego interfejsu API pozostałego, czyli: /api/management/login Używam Retrofit). Następnie sprawdzam, czy użytkownik istnieje, czy nie, i zwracam obiekt, jeśli tak, lub null jeśli nie. Zauważyłem, że zakodowane hasło różni się od tego przechowywanego w mojej bazie danych, nawet jeśli początkowe ciągi hasła są takie same. Czytałem, że interfejs PasswordEncoder generuje losową sól w celu zakodowania hasła. Czy istnieje sposób, aby sól była wyjątkowa? Oto mój plik konfiguracji zabezpieczeń wiosennych:


@Configuration
@EnableWebSecurity
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {
    private UserPrincipalDetailsService userPrincipalDetailsService;

    public SecurityConfiguration(UserPrincipalDetailsService userPrincipalDetailsService) {
        this.userPrincipalDetailsService = userPrincipalDetailsService;
    }

    @Override
    protected void configure(AuthenticationManagerBuilder auth) {
        auth.authenticationProvider(authenticationProvider());
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {


            http.csrf()
            .disable()
            .exceptionHandling()
            .authenticationEntryPoint(new Http403ForbiddenEntryPoint() {}).and()
            .authenticationProvider(authenticationProvider())
            .authorizeRequests()
                .antMatchers("/management/*").hasRole("ADMIN")
                .antMatchers("/*").hasRole("ADMIN")
                .antMatchers("/management/professor*").hasRole("ADMIN")
                .antMatchers("/management/absence*").hasRole("ADMIN")
                .antMatchers("/management/room*").hasRole("ADMIN")
                .anyRequest().permitAll()
                .and()
                .formLogin()
                .loginProcessingUrl("/signin").permitAll()
                .loginPage("/login").permitAll()
                .successHandler(mySimpleUrlAuthenticationHandler())
                .failureUrl("/login?error=true")
                .usernameParameter("username")
                .passwordParameter("password")
                .and()
                .logout().logoutRequestMatcher(new AntPathRequestMatcher("/logout")).logoutSuccessUrl("/login")
                .and()
                .rememberMe().userDetailsService(userPrincipalDetailsService).rememberMeParameter("checkRememberMe");
    }

    @Bean
    DaoAuthenticationProvider authenticationProvider(){
        DaoAuthenticationProvider daoAuthenticationProvider = new DaoAuthenticationProvider();
        daoAuthenticationProvider.setPasswordEncoder(passwordEncoder());
        daoAuthenticationProvider.setUserDetailsService(this.userPrincipalDetailsService);

        return daoAuthenticationProvider;
    }

    @Bean
    PasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
    }

    @Bean
    MySimpleUrlAuthenticationHandler mySimpleUrlAuthenticationHandler() {
        return new MySimpleUrlAuthenticationHandler();
    }
}

Jakieś zalecenia?

0
MysticJumper 30 grudzień 2019, 18:35

1 odpowiedź

Najlepsza odpowiedź

Myślę, że kodujesz hasło otrzymane od klienta i na stałe wpisujesz je w zapytanie SQL z identyfikatorem logowania. Jeśli moje założenie jest poprawne, nie rób tego.

Jak powiedziałeś

Sprawdzam, czy użytkownik istnieje, i zwracam obiekt, jeśli tak, lub zerowy, jeśli nie

Nie koduj hasła i nie łącz go z zapytaniem SQL (w /login API). Zamiast tego pobierz dane tylko na podstawie identyfikatora logowania. Jeśli zwraca obiekt, to oczywiście zwraca zakodowane hasło. Teraz musisz porównać już zakodowane hasła ze zwykłym hasłem otrzymanym od klienta.

import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;

BCryptPasswordEncoder encoded = BCryptPasswordEncoder();
boolean matches = encoder.matches("plain password from client", "encoded password here");

if (matches) {
   // successull login
} else {
   // invalid login credentials
}

Więcej informacji można znaleźć w tym Bcryptpasswordencoder # mecze () Springboot Doc

0
Shashanth 31 grudzień 2019, 05:28