18

से निपटने त्रुटि मैं Spring Oauth2 और Spring Pre-post Annotations उपयोग कर रहा हूँ के साथ Spring-bootPreAuthorize

मैं एक सेवा वर्ग MyService है। MyService तरीकों में से एक है:

@PreAuthorize("#id.equals(authentication.principal.id)") 
public SomeResponse getExampleResponse(String id){...} 

मैं कुछ तरीके से json कि फोन करने वाले नियंत्रक द्वारा दिया जाता है नियंत्रित कर सकते हैं?

json कि डिफ़ॉल्ट रूप से दिया जाता है है:

{error : "access_denied" , error_message: ".."} 

मैं error_message परम नियंत्रित करने में सक्षम होना चाहता हूँ। मैं करने के लिए कुछ इसी तरह की तलाश में हूँ:

@PreAuthorize(value ="#id.equals(authentication.principal.id)", onError ="throw new SomeException("bad params")") 
public SomeResponse getExampleResponse(String id){...} 

एक तरह से मैं यह कर के बारे में सोचा है ExceptionHandler

@ExceptionHandler(AccessDeniedException.class) 
public Response handleAccessDeniedException(Exception ex, HttpServletRequest request){ 
    ... 
} 

का उपयोग करना द्वारा लेकिन मैं अपवाद की message नियंत्रित नहीं कर सकते। और मैं यह भी सुनिश्चित नहीं कर सकता कि यह Exception भावी रिलीज में फेंक दिया जाएगा

+0

'{त्रुटि:" access_denied ", error_message:" .. "} 'वसंत बूट डिफ़ॉल्ट त्रुटि हैंडलर से आउटपुट की तरह दिखता है। क्या आप इसका उपयोग कर रहे हैं? –

+0

हां @ डेवसियर मैं आपके उत्तर के लिए स्प्रिंग बूट – royB

उत्तर

8

त्रुटि प्रबंधन पर स्प्रिंग बूट डॉक्स: http://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#boot-features-error-handling। JSON को नियंत्रित करने का एक तरीका @Bean प्रकार ErrorAttributes जोड़कर है।

@Bean 
ErrorAttributes errorAttributes() { 
    return new MyErrorAttributes(); 
} 
+1

धन्यवाद का उपयोग कर रहा हूं। प्रलेखन भाग वास्तव में स्पष्ट नहीं है और इस विषय पर 'कैसे करें' होना बहुत अच्छा होगा। 'DefaultErrorAttributes' विधि: 'addErrorDetail' मैं' त्रुटि एट्रिब्यूट्स' को पारित 'थ्रोरेबल त्रुटि' संदेश को कैसे नियंत्रित कर सकता हूं? – royB

+0

यदि अपवाद '@ प्रीअधिकृत 'से आता है तो आप इसे अधिक नियंत्रित नहीं कर सकते हैं (या कम से कम मैं नहीं देख सकता कि आप क्यों चाहते हैं)। मुझे लगता है कि, आप एक कस्टम 'AccessDecisionManager' जोड़ सकते हैं, लेकिन यह वास्तव में बहुत मुख्यधारा नहीं है। –

+3

हाय @ डेवसियर, मेरे पास स्थिति है @PreAuthorize ("isAuthenticated() और principal.user.isEnabled() == true और principal.user.is पुष्टि की गई है() == सच") 'और मैं अलग-अलग बाधाओं को अलग करना चाहता हूं AccessDeniedException फेंकता है। फिर इसे संभाल लें और असंतुष्ट स्थिति के आधार पर अपना अपवाद फेंक दें। या केवल अपने स्वयं के पहलू को लिखने और अपवादों को फेंकने के लिए मैं इसे करने के लिए क्या कर सकता हूं? – InsFi

संबंधित मुद्दे