Я создал загрузочное приложение 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;
}
}