Как использовать BCrypt на клиенте для использования RESTful Web Service? - PullRequest
0 голосов
/ 15 апреля 2019

Я создал загрузочное приложение Spring и использую BCryptPasswordEncoder для кодирования паролей.У меня также есть экран базы данных и входа в систему, и все пользователи проходят аутентификацию с использованием BCryptPasswordEncoder.

У меня есть папка «admin», и все внутри «admin» должно быть аутентифицировано.Я создал RestController внутри этого пакета 'admin', и он, в свою очередь, возвращает некоторые данные для меня.

Приложение Spring Boot должно обрабатывать логины пользователей с экрана входа в систему, а также вызовы RESTful от клиентов.

Я пытаюсь создать клиент для использования веб-службы RESTful, но не могу пройти проверку подлинности BCrypt.

Я пробовал различные способы реализации BCryptPasswordEncoder на стороне клиента, но всегда получаю «Not Authenticated»или он возвращает экран входа в систему в качестве данных ответа JSON, что, конечно, не то, что я хочу.

Основное приложение Spring Boot:

@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

    @Autowired
    SecureAuthenticationSuccessHandler secureAuthenticationSuccessHandler;

    @Autowired
    CustomUserDetailsService customUserDetailsService;

    private String publicResources[] = new String[]{"/", "/assets/**", "/images/**", "/webjars/**"};
    private String privateResources[] = new String[]{"/admin/**"};

    @Autowired
    public void configureGlobalSecurity(AuthenticationManagerBuilder auth) throws Exception {
        auth.inMemoryAuthentication().withUser("restclient").password("restpassword").roles("ADMIN");
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.csrf().disable()
            .authorizeRequests()
                .antMatchers(publicResources).permitAll()
                .antMatchers(privateResources).hasRole("ADMIN")
                .anyRequest().authenticated()
                .and()
                    .formLogin()
                    .loginPage("/login")
                    .permitAll()
                    .failureUrl("/login?error=true")
                        .usernameParameter("username")
                        .passwordParameter("password")
                        .successHandler(secureAuthenticationSuccessHandler)
                .and()
                    .logout()
                        .logoutRequestMatcher(new AntPathRequestMatcher("/logout"))
                        .logoutSuccessUrl("/login")
                        .deleteCookies("JSESSIONID")
                        .invalidateHttpSession(true)
                .and()
                    .exceptionHandling().accessDeniedHandler(accessDeniedHandler());
    }

    @Override
    public void configure(AuthenticationManagerBuilder builder) throws Exception {
        builder.userDetailsService(customUserDetailsService);
    }


    public AccessDeniedHandler accessDeniedHandler(){
        return new CustomAccessDeniedHandler();
    }

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

    @Autowired
    public void ConfigureGlobal (AuthenticationManagerBuilder auth) throws Exception {
        auth.userDetailsService(customUserDetailsService).passwordEncoder(passwordEncoder());
    }
}

У меня есть это в другом приложении Spring Boot(клиент):

@Component
public class ApplicationStartup implements ApplicationListener<ContextRefreshedEvent> {

    String url = "http://localhost:8000/mailsourcerestcontroller/mailconnectors/";

    @Override
    public void onApplicationEvent(final ContextRefreshedEvent event) {

        try {

            RestTemplate restTemplate = new RestTemplate();

            HttpEntity<String> request = new HttpEntity<String>(getHeaders());
            ResponseEntity response = restTemplate.exchange(url, HttpMethod.GET, request, String.class);
            String usersMap = (String) response.getBody();

        } catch (Exception e) {
            e.printStackTrace();
            ;
        }
    }

    private static HttpHeaders getHeaders(){
        String plainCredentials="restclient:restpassword";
        String base64Credentials = new String(passwordEncoder().encode(plainCredentials));

        HttpHeaders headers = new HttpHeaders();
        headers.add("Authorization", "Basic " + base64Credentials);
        headers.setAccept(Arrays.asList(MediaType.APPLICATION_JSON));
        return headers;
    }

    public static BCryptPasswordEncoder passwordEncoder() {
        BCryptPasswordEncoder bCryptPasswordEncoder = new BCryptPasswordEncoder(8);
        return bCryptPasswordEncoder;
    }

}
...