Пост рестемплат в Spring не работает, а работает - PullRequest
0 голосов
/ 08 января 2019

Это мой код клиента:

@GetMapping("/")
    public String home() throws NoSuchAlgorithmException, CertificateException, FileNotFoundException, IOException, KeyStoreException, KeyManagementException, UnrecoverableKeyException, RestClientException, URISyntaxException {

        String url = "https://localhost:8483/secure-server/hola";
//        
//        KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType());
//        
//        keyStore.load(new FileInputStream(new File("client-keystore.jks")), "secret".toCharArray());
//
//        System.out.println(url);
//        SSLConnectionSocketFactory socketFactory = new SSLConnectionSocketFactory(
//                new SSLContextBuilder()
//                        .loadTrustMaterial(null, new TrustSelfSignedStrategy())
//                        .loadKeyMaterial(keyStore, "secret".toCharArray())
//                        .build(),
//                NoopHostnameVerifier.INSTANCE);
//
//        HttpClient httpClient = HttpClients.custom().setSSLSocketFactory(socketFactory).build();
//
//        ClientHttpRequestFactory requestFactory = new HttpComponentsClientHttpRequestFactory(httpClient);
//        RestTemplate restTemplate = new RestTemplate(requestFactory);
//        String record = restTemplate.getForObject(url, String.class);
////        
//

        HttpHeaders headers = new HttpHeaders();
        headers.setContentType(MediaType.APPLICATION_JSON);

        HttpEntity<String> request = new HttpEntity<>("", headers);

        return restTemplate.exchange(url, HttpMethod.POST, request , String.class ).getBody();

//
//        ResponseEntity<String> resp = restTemplate.exchange(
//                new URI(url), HttpMethod.GET, 
//                httpEntity, String.class);

        //return model.getBody();


    }

    @Bean
    public RestTemplate restTemplate(RestTemplateBuilder builder) throws Exception {
        char[] password = "secret".toCharArray();

        SSLContext sslContext = SSLContextBuilder.create()
                .loadKeyMaterial(keyStore("client-keystore.jks", password), password)
                .loadTrustMaterial(new File("client-truststore.jks"),"secret".toCharArray()).build();

        HttpClient client = HttpClients.custom().setSSLContext(sslContext).build();
        return builder
                .requestFactory(new HttpComponentsClientHttpRequestFactory(client))
                .build();
    }

     private KeyStore keyStore(String file, char[] password) throws Exception {
        KeyStore keyStore = KeyStore.getInstance("jks");
        File key = ResourceUtils.getFile(file);
        try (InputStream in = new FileInputStream(key)) {
            keyStore.load(in, password);
        }
        return keyStore;
    }

Это мой серверный код с двумя методами post и get, get работает, но post не работает:

@RestController
public class HomeRestController {
   @PostMapping("/hola")
   public String home(Principal principal) {
      return String.format("Hello %s!", principal.getName());
   }

   @GetMapping("/holaa")
   public String homee(Principal principal) {
      return String.format("Hello %s!", principal.getName());
  }
}

У меня есть мой YML с конфигурацией взаимной аутентификации:

server:
  context-path: /${spring.application.name}
  port: 8483
  ssl:
    key-store: server-keystore.keystore
    key-store-password: pass123
    key-alias: default
    trust-store: server-truststore.jks
    trust-store-password: secret
    enabled: true
    client-auth: need

Вызов getMaping работает, но вызов postMaping возвращает мне 403.

Хранилище ключей и trustore настроены и в порядке.

И в моей конфигурации безопасности у меня есть:

@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests().anyRequest().authenticated().and().x509()
                .subjectPrincipalRegex("CN=(.*?)(?:,|$)").userDetailsService(userDetailsService());
    }

    @Override
    @Bean
    public UserDetailsService userDetailsService() {
        return (username -> {

                return new User(username, "",
                        AuthorityUtils.commaSeparatedStringToAuthorityList("ROLE_USER"));

        });
    }
}

Почему не работает мой почтовый звонок?

...