2015-07-27 29 views
6

Trong Xuân An OAuth2 xác thực dựa khi khách hàng gửi một access token mà cần phải được làm mới, lớp DefaultTokenServices ném một InvalidTokenException (xem tại dòng 235):Xuân OAuth2 - tùy chỉnh xử lý ngoại lệ

https://github.com/spring-projects/spring-security-oauth/blob/master/spring-security-oauth2/src/main/java/org/springframework/security/oauth2/provider/token/DefaultTokenServices.java

đầu ra khi điều này xảy ra là:

{"error":"invalid_token","error_description":"Invalid access token: a0cb5ab9-7281-46bd-a9a2-796a04a906c9" 
} 

Tôi muốn thay đổi đầu ra này nhưng bị mất. Một số câu trả lời khác được đề xuất thiết lập tùy chỉnh exceptionRenderer nhưng điều này không hoạt động, trình kết xuất ngoại lệ tùy chỉnh của tôi không bao giờ được gọi trong những trường hợp này.

Cũng có một số được gọi là dịch ngoại lệ nhưng chúng không được gọi là bất kỳ trường hợp nào.

Một phần của cấu hình mùa xuân của tôi:

<bean id="clientAuthenticationEntryPoint" 
     class="org.springframework.security.oauth2.provider.error.OAuth2AuthenticationEntryPoint"> 
    <property name="typeName" value="Basic"/> 
    <property name="exceptionRenderer" ref="myExceptionRenderer" /> 
</bean> 


<bean id="oauthAuthenticationEntryPoint" 
     class="org.springframework.security.oauth2.provider.error.OAuth2AuthenticationEntryPoint"> 
     <property name="exceptionRenderer" ref="myExceptionRenderer" /> 
     <property name="exceptionTranslator" ref="listyOauthExceptionTranslator" /> 
</bean> 

<bean id="oauthAccessDeniedHandler" class="org.springframework.security.oauth2.provider.error.OAuth2AccessDeniedHandler" > 
<property name="exceptionRenderer" ref="myExceptionRenderer" /> 
<property name="exceptionTranslator" ref="myExceptionTranslator" /> 
</bean> 

<bean id="myExceptionRenderer" class="com.example.exceptions.MyOauth2ExceptionRenderer" /> 

<bean id="myExceptionTranslator" class="com.example.exceptions.MyOauth2ExceptionTranslator" /> 

Các renderer ngoại lệ:

public class MyExceptionRenderer implements OAuth2ExceptionRenderer { 

@Override 
public void handleHttpEntityResponse(HttpEntity<?> responseEntity, ServletWebRequest webRequest) throws Exception { 
    System.out.println("Thrown exception"); 
} 

}

Tôi cũng đã thêm một Mapper tùy chỉnh ngoại lệ đó sẽ nhận được TẤT CẢ các trường hợp ngoại lệ, nhưng kể từ khi tôi giả sử một servlet khác của nó không thực sự làm việc trong trường hợp này?

@Provider 
public class GenericExceptionMapper implements ExceptionMapper<Throwable> { 

@Override 
public Response toResponse(Throwable ex) { 
    System.out.println("MAPPING EXCEPTION"); 
    return Response.status(200).entity().build(); 
} 
} 

tôi có thể nắm bắt các trường hợp AuthenticationException, nhưng không phải bất kỳ InvalidTokenExceptions.

Bất kỳ trợ giúp nào về vấn đề này? Spring thực sự thu nhận InvalidTokenException này ở đâu và làm thế nào tôi có thể thiết lập nó để tôi có thể cung cấp đầu ra tùy chỉnh?

+0

Bạn đang sử dụng phiên bản Oauth2 nào? '2.0.7' hoặc' 1. * '? – Karthik

+0

Tôi đang sử dụng chúng: – breakline

+0

4.0.5.RELEASE 3.2.4.RELEASE 2.0.3.RELEASE 1.0.2.RELEASE breakline

Trả lời

5

InvalidTokenException mở rộng ClientAuthenticationException. Vì vậy, bạn có thể tạo ra ngoại lệ của riêng bạn bằng cách mở rộng ClientAuthenticationException và ném này thay vì InvalidTokenException

public class CustomException extends ClientAuthenticationException { 

    public CustomException(String msg, Throwable t) { 
     super(msg, t); 
    } 

    public CustomException(String msg) { 
     super(msg); 
    } 
    @Override 
    public String getOAuth2ErrorCode() { 
     return "my_custom_exception"; 
    } 
} 

như

throw new CustomException("Invalid access token: " + accessTokenValue); 

Trong báo lỗi được ném bởi InvalidTokenException

{"error":"invalid_token","error_description":"Invalid access token: a0cb5ab9-7281-46bd-a9a2-796a04a906c9"} 

invalid_token được trả về bởi getOAuth2ErrorCode() phương thức của InvalidTokenException và Invalid access token: a0cb5ab9-7281-46bd-a9a2-796a04a906c9 là thông điệp mà bạn đưa ra khi bạn ném thứ e ngoại lệ.

Nếu bạn ném

throw new CustomException("This is my custom exception"); 

lỗi sẽ được hiển thị như

{"error":"my_custom_exception","error_description":"This is my custom exception"} 

my_custom_exception đến từ getOAuth2ErrorCode() của CustomException.

+0

Tôi không thể sử dụng ngoại lệ tùy chỉnh , kể từ khi Servlet Spring Security của nó và người lập bản đồ ngoại lệ của tôi không bao giờ được gọi. Tôi tìm thấy điều này cũng có, nhưng tôi không biết làm thế nào để cấu hình này thông qua xml? – breakline

+0

https://github.com/spring-projects/spring-security-oauth/issues/375 – breakline

+0

@breakline ý bạn là gì bởi bạn không thể sử dụng ngoại lệ tùy chỉnh? Ném ngoại lệ tùy chỉnh này vào 'DefaultTokenServices' của bạn. – Karthik

3

Câu trả lời không thực sự triển khai tùy chỉnh, phản hồi tùy chỉnh sẽ là một điểm trong mã mà tôi có thể truy cập phản hồi mặc định và tôi có thể gửi POJO thay vì, ví dụ: nếu bạn muốn thay đổi error_description thành error_info hoặc bất kỳ điều gì khác hoặc bạn có thể muốn thêm các biến khác vào phản hồi. Giải pháp không tồn tại, nhưng tôi nghĩ thật khó để thực hiện để nói ít nhất, khi tôi sao chép nó từ here:

Vấn đề này đã được giải quyết. Theo dõi giải pháp bên dưới: 1 mở rộng OAuth2Exception thành một lớp mới, chẳng hạn như CustomOAuth2Exception. Trong lớp tùy chỉnh, thêm một số thuộc tính cụ thể. 2 tùy chỉnh DefaultWebResponseExceptionTranslator và đăng ký trình dịch tùy chỉnh trong AuthorizationServerConfiguration. 3 tùy chỉnh hai serializers jackson được chú thích trong OAuth2Exception và chú thích CustomOAuth2Exception của bạn với hai serializers tùy chỉnh. 4 sử dụng ObjectMapper để ghi đè các bộ nối tiếp ban đầu với các bộ nối tiếp tùy chỉnh.