2016-11-29 7 views
1

私は以下の問題があります。Springブートによって提供されるAuthenticationProviderクラスをカスタマイズして、リモートサーバー上にあります。SpringのAuthentication APIで、HTTPステータスが403の場合のREST APIからの応答を傍受する方法

資格情報が正しい場合は問題ありません。

問題は、資格情報が間違っている、サーバの応答のHTTPステータスは、実際には403 あるとき、それは自動的にAPIの残りの例外が発生しますので、私は、応答を取得することはできませんが発生:

ResponseEntity <UserResponse> resp = restTemplate.exchange (url, HttpMethod.POST, requestEntity, UserResponse.class); 

@ControllerAdvice注釈で例外をキャッチするためにカスタムクラスを作成しようとしましたが、コントローラではなくAuthenticationProviderクラスで例外が発生するため、呼び出すことはできません。

残りのAPI例外の応答を傍受する方法はありますか?

public class CustomAuthenticationProvider implements AuthenticationProvider { 

private static final Logger log = LoggerFactory.getLogger(CustomAuthenticationProvider.class); 

@Value("${search.login}") 
private String searchLogin; 

@Autowired 
private HttpServletRequest request; 

private DateFormat fmt = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'"); 

@Override 
public Authentication authenticate(Authentication authentication) throws AuthenticationException { 
    User user=new User(); 
    ObjectWriter ow = new ObjectMapper().writer(); 
    String json="log-> "; 
    UserResponse response=new UserResponse(); 
    try { 

       RestTemplate restTemplate = new RestTemplate(); 
       URI url; 
       url = new URI(searchLogin); 
       MultiValueMap<String, String> map = new LinkedMultiValueMap<String, String>(); 
       map.add("username",URLEncoder.encode(authentication.getName(), "utf-8")); 
       map.add("password",URLEncoder.encode(authentication.getCredentials().toString(), "utf-8")); 
       HttpHeaders requestHeaders = new HttpHeaders(); 
       requestHeaders.setContentType(MediaType.APPLICATION_FORM_URLENCODED); 
       List<MediaType> acceptableMediaTypes=new ArrayList<MediaType>(); 
       acceptableMediaTypes.add(MediaType.APPLICATION_JSON_UTF8); 
       requestHeaders.setAccept(acceptableMediaTypes); 
       HttpEntity<MultiValueMap<String, String>> requestEntity = new HttpEntity<MultiValueMap<String, String>>(map,requestHeaders); 
       ResponseEntity<UserResponse> resp = restTemplate.exchange(url, HttpMethod.POST, requestEntity, UserResponse.class); 
       response = resp.getBody(); 

ありがとうございます。

+0

何をしようとしていますか?あなたは「応答を得る」ことができないと言います - どこで?どのような目的のために?正しい(403)応答が得られているように見えます。具体的には、異なるものにしたいのですか? – chrylis

+0

はい、私は正しい403を得るが、私は応答を読んでログに記録したいと思う。しかし、春のフレームワークによって例外が発生して処理され、応答を読み取ることができません。 – Maforast

+0

403を受け取ったら、例外が発生したと判断してログに出力できます。それは...ですか ?またはあなたは例外をキャッチして、それを再び投げて、@ ExcepionHandlerと組み合わせて、おそらく動作するかもしれません。 –

答えて

0

@ControllerAdviceはコントローラから直接スローされる例外を傍受するだけなので、Spring Securityから処理する必要があります。私はthis linkあなたが探している解決策を与えると思います。

+0

はい、コントローラからのサービスを休憩と呼びますが、コントローラが呼び出される前にAuthenticationProviderクラスに入っていれば正解になります。 – Maforast

-1

あなたの残りの部分に@ExceptionHandlerを追加できます。例えばのように。 @ExceptionHandler public String exp(HttpServletRequest request, Exception ex) {
//balabala }

+1

ControllerAdvice/ExceptionHandlerは、コントローラ – Rubasace

関連する問題