Сбой аутентификации Spring с помощью BCryptPasswordEncoder - PullRequest
0 голосов
/ 25 июня 2019

Я новичок в весне и пытаюсь внедрить весеннюю безопасность в проект. Я смог создать пользователя с паролем хэша, используя Bcrypt, но всякий раз, когда я пытался войти в систему, используя тот же пароль, он терпел неудачу. Я также пытался проверить другие ответы SO (например, Spring Security BCryptPasswordEncoder вставлен, но не соответствует ), но не решил возникшие проблемы.

Ниже то, что пытались до сих пор

Класс WebSecurityConfigurerAdapter

@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class WebSecurityConfig  extends WebSecurityConfigurerAdapter {

    @Autowired
    private UserDetailsServiceImpl userDetailsService;

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

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        // TODO Auto-generated method stub
        http.csrf().disable();
        http.authorizeRequests().antMatchers("/login", "/app-assets/**", "/assets/**").permitAll();
        http.authorizeRequests().antMatchers("/add-user", "/users-list").hasRole("ADMIN");
        http.authorizeRequests().antMatchers("/", "/index", "/add-content", "/mange-content").hasAnyRole("ADMIN", "USER");

        http
        .formLogin()
        .loginPage("/login")
        .defaultSuccessUrl("/index")
        .failureUrl("/login?error=true")
        .usernameParameter("username")
        .passwordParameter("password")
        //.failureUrl("/login-error.html")
      .and()
        .logout()
        .invalidateHttpSession(true)
        .clearAuthentication(true)
        .logoutSuccessUrl("/login?logout")
        .logoutRequestMatcher(new AntPathRequestMatcher("/logout"))
        .permitAll();

    }

    @Bean
    public DaoAuthenticationProvider authProvider() {
        System.out.println("GOT CALLED HERE.....");
        DaoAuthenticationProvider authProvider = new DaoAuthenticationProvider();
        authProvider.setUserDetailsService(userDetailsService);
        authProvider.setPasswordEncoder(passwordEncoder());
        return authProvider;
    }


    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        // TODO Auto-generated method stub 
        //auth.userDetailsService(userDetailsService).passwordEncoder(passwordEncoder());
        auth.authenticationProvider(authProvider());
    }
}

UserDetailsService

@Service
public class UserDetailsServiceImpl implements UserDetailsService {
    @Autowired
    private UserDAO userDAO;

    @Autowired
    private RoleDAO roleDAO;

    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
        User user = userDAO.findUserByUsername(username);

        if (user == null) {
            throw new UsernameNotFoundException("User "+username+"not fount");
        }


        List<String> roleNames = roleDAO.getRoleNames(user.getAdminId());

        System.out.println("USERNAME: "+user.getAdminId() + " "+user.getPassword());
        List<GrantedAuthority> grantList = new ArrayList<GrantedAuthority>();
        if (roleNames != null) {
            for (String role : roleNames) {
                GrantedAuthority authority = new SimpleGrantedAuthority(role);
                grantList.add(authority);
            }
        }

        UserDetails userDetails = (UserDetails) new org.springframework.security.core.userdetails.User(user.getUsername(), user.getPassword(), grantList);


        return userDetails;
    }

}

TEST

@RunWith(SpringRunner.class)
@SpringBootTest
public class ApplicationTests {

    @Autowired
    private UserDAO userDAO;

    @Autowired
    private BCryptPasswordEncoder encoder;

    @Test
    public void contextLoads() {
        String password = "eureka";
        String encrytedPassword = encoder.encode(password);


        User user = userDAO.findUserByEmail("xxx@gmail.com");

        System.out.println(encrytedPassword);
        System.out.println("Matched: " + encoder.matches("eureka", encrytedPassword));//This line returns true
        assertEquals(encrytedPassword, user.getPassword());
    }
}

Я также пытался переопределить совпадения (), но безрезультатно

@Bean
    public BCryptPasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder() {
            @Override
            public boolean matches(CharSequence rawPassword, String encodedPassword) {
                // This throws an error
                return matches(rawPassword, encodedPassword);
            }
        };
    }

Примечание. Хэшированный пароль и необработанный пароль были получены с помощью метода match (). Так что нет проблем с получением хэш-пароля из базы данных.

...