Я разработал приложение 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.Хорошо ли это решение или есть более простой и безопасный способ сделать это?
Большое спасибо за потраченное время.