Как войти в Spring Boot с помощью HttpClient из другого клиента Spring Boot - PullRequest
0 голосов
/ 07 июня 2019

Я разработал приложение 2 Spring Boot.Для простоты давайте назовем их admin и client.

Я добавил REST-контроллер на стороне администратора.URL защищен, и только авторизованные пользователи могут получить к нему доступ.Я использую .antMatches из весенней защиты в WebsecurityConfigurerAdapter для защиты доступа к URL.Я также разработал свою собственную форму входа в систему и не использую стандартную форму, предоставленную Spring Security.

На стороне клиента я использую Apache HttpClient для входа в систему на стороне администратора.После успешного входа в систему я затем хочу получить доступ к своему контроллеру REST.

Я пробовал CURL, но не мог заставить его работать, потому что я решил использовать HttpClient.Контроллер REST довольно прост, поэтому я не собираюсь показывать этот код здесь.

Я попробовал приведенный ниже код, но получил ответ 302.Мое единственное предположение, что Spring Boot / Security делает какое-то перенаправление.

//Login url is: http://localhost:8080/login
CloseableHttpClient client = HttpClients.createDefault();
HttpPost httpPost = new HttpPost(environment.getProperty("myhost") + "/login");

List<NameValuePair> params = new ArrayList<>();
params.add(new BasicNameValuePair("username", environment.getProperty("myuser")));
params.add(new BasicNameValuePair("password", environment.getProperty("mypass")));
httpPost.setEntity(new UrlEncodedFormEntity(params));

CloseableHttpResponse response = client.execute(httpPost);

if(response.getStatusLine().getStatusCode() == 200) {
   System.out.println("Connected");
}else{
   System.out.println(response.getStatusLine().getStatusCode());
}

/*
Here I want to call my REST controller:
*/
String restUri = "http://localhost:8080/rest/myrest";
RestTemplate restTemplate = new RestTemplate();
HttpHeaders headers = new HttpHeaders();
headers.setAccept(Arrays.asList(MediaType.APPLICATION_JSON));
HttpEntity<String> entity = new HttpEntity<String>("parameters", headers);

ResponseEntity<String> result 
    = restTemplate.exchange(restApi, HttpMethod.GET, entity, String.class);

response.close();

Обратите внимание, что мой логин и мой остальной URL разные.Не 100%, если это сработает.

И мой метод конфигурирования WebSecurityConfigurerAdapter, если вам нужно его увидеть.

@Override
protected void configure(HttpSecurity http) throws Exception {
  http
    .authorizeRequests()
    .antMatchers(publicResources).permitAll()
  .antMatchers(privateResources).hasRole("ADMIN").anyRequest().authenticated()
    .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());
    }

Поэтому я хочу защитить мой REST-контроллер от неавторизованных пользователей.От клиента войдите в него и затем вызовите контроллер REST.Хорошо ли это решение или есть более простой и безопасный способ сделать это?

Большое спасибо за потраченное время.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...