Spring-Security: доступ к защищенным ресурсам с использованием файла cookie, возвращаемого при входе в систему.

Я работаю над настольным приложением 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???


person We are Borg    schedule 01.07.2015    source источник


Ответы (1)


  1. Если вы хотите получить некоторую информацию о пользователе, которая хранится на стороне сервера, вам следует создать новую службу, например, «getUserInformation» на вашем сервере, которая будет предоставлять такую ​​информацию.
  2. Вы не должны извлекать файлы cookie вручную, просто повторно используйте один и тот же RestTemplate, он хранит файлы cookie внутри (в частности, в базовом HttpClient). Вот как вы можете получить доступ к безопасным ресурсам.

ОБНОВЛЕНИЕ:

Вам не нужно передавать RestTemplate, просто сделайте его синглтоном и используйте его везде.

И rssResponse.getBody(); должен вернуть вам объект Person, а не String.

person Ilya Murzinov    schedule 01.07.2015
comment
Я уже создал метод на стороне сервера для получения объекта Person. Это то, что я собирался попробовать. Моя идея заключалась в том, что я мог бы каким-то образом сохранить файл cookie в БД локальных пользовательских машин, поэтому мне не нужно продолжать передавать объект RestTemplate, когда пользователь щелкает мышью. - person We are Borg; 01.07.2015
comment
Не могли бы вы проверить обновленный пост, я добавил информацию внизу. Большое спасибо. :-) - person We are Borg; 01.07.2015
comment
Можете ли вы сказать мне, где я могу создать RestTemplate как Singleton? - person We are Borg; 06.07.2015