Я работаю над настольным приложением Java, и после некоторого поиска мне удалось аутентифицировать пользователя с помощью RestTemplate. Теперь ситуация такова, что у меня есть строка cookie на стороне рабочего стола (код приведен ниже). Теперь я хотел бы сделать две важные вещи: узнать, какой пользователь вошел в систему с помощью этого файла cookie, и получить доступ (GET, POST, DELETE) к защищенным ресурсам, которые отмечены аннотацией @Secured или @PreAuthorize.
вот мой код аутентификации:
@Override
public void initialize(URL location, ResourceBundle resources) {
submitButton.setOnAction(event -> {
if(!(usernameField.getText().isEmpty() && passwordField.getText().isEmpty())){
try {
RestTemplate rest = new RestTemplate();
String jsessionid = rest.execute("http://localhost:8080/j_spring_security_check", HttpMethod.POST,
new RequestCallback() {
@Override
public void doWithRequest(ClientHttpRequest request) throws IOException {
request.getBody().write(("j_username=" + usernameField.getText() + "&j_password=" + passwordField.getText()).getBytes());
}
}, new ResponseExtractor<String>() {
@Override
public String extractData(ClientHttpResponse response) throws IOException {
List<String> cookies = response.getHeaders().get("Cookie");
// assuming only one cookie with jsessionid as the only value
if (cookies == null) {
cookies = response.getHeaders().get("Set-Cookie");
}
String cookie = cookies.get(cookies.size() - 1);
System.out.println("Cookie is "+cookie);
int start = cookie.indexOf('=');
int end = cookie.indexOf(';');
return cookie.substring(start + 1, end);
}
});
// rest.put("http://localhost:8080/rest/program.json;jsessionid=" + jsessionid, new DAO("REST Test").asJSON());
} catch (AuthenticationException e) {
System.out.println("AuthenticationException");
}
} else {
System.out.println("Fields are empty");
}
});
}
Вывод программы:
DEBUG: org.springframework.web.client.RestTemplate - Created POST request for "http://localhost:8080/j_spring_security_check"
DEBUG: org.springframework.web.client.RestTemplate - POST request for "http://localhost:8080/j_spring_security_check" resulted in 302 (Found)
Cookie is JSESSIONID=903B2924CCC84421931D52A4F0AA3C7E; Path=/; HttpOnly
Если бы я был на стороне сервера, я бы просто вызвал метод ниже, чтобы получить текущего аутентифицированного пользователя:
@Override
public Person getCurrentlyAuthenticatedUser() {
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
if (authentication == null) {
return null;
} else {
return personDAO.findPersonByUsername(authentication.getName());
}
}
Как я могу получить текущего аутентифицированного пользователя в настольном java-приложении, чтобы я мог просто использовать метод ниже и аутентифицироваться в настольном java-приложении. :
Collection<GrantedAuthority> authorities = new ArrayList<>();
authorities.add(new SimpleGrantedAuthority("ROLE_USER"));
Authentication authentication = new UsernamePasswordAuthenticationToken(person1, null, authorities);
SecurityContextHolder.getContext().setAuthentication(authentication);
Таким образом, я могу использовать аннотации @Secured и для настольного Java-приложения. Большое спасибо.
Обновить
Итак, на стороне сервера я создал метод, который дает мне вошедшего в систему пользователя. Как было предложено в ответе, я могу использовать тот же шаблон отдыха, но я хотел бы сохранить файл cookie в локальной базе данных пользователей вместо того, чтобы передавать объект Resttemplates, когда пользователь щелкает здесь и там.
Метод на стороне сервера:
@Secured("ROLE_USER")
@RequestMapping(value = "/rest/getloggedinuser", method = RequestMethod.GET)
public
@ResponseBody
ResponseEntity<RestPerson> getLoggedInRestUser() {
Person person = this.personService.getCurrentlyAuthenticatedUser();
RestPerson restPerson = new RestPerson();
restPerson.setFirstname(person.getFirstName());
restPerson.setUsername(person.getUsername());
restPerson.setPassword("PROTECTED");
return new ResponseEntity<RestPerson>(restPerson, HttpStatus.OK);
}
Теперь, а пока, я пытаюсь использовать тот же RestTemplate, чтобы проверить, работает ли этот метод с кодом ниже, но мне бы очень хотелось знать, как я могу сделать это только с помощью файла cookie:
HttpHeaders requestHeaders = new HttpHeaders();
requestHeaders.add("Cookie", cookie);
HttpEntity requestEntity = new HttpEntity(null, requestHeaders);
ResponseEntity rssResponse = rest.exchange(
"/rest/getloggedinuser",
HttpMethod.GET,
requestEntity,
Person.class);
String rssResponseBody = (String)rssResponse.getBody();
System.out.println("Response body is ");
Есть ли способ передать объект в ResponseBody объекту Person???