web-dev-qa-db-ja.com

エラー処理の事前承認

Spring Oauth2Spring Pre-post AnnotationsSpring-bootで使用しています

私はサービスクラスMyServiceを持っています。 MyServiceメソッドの1つは次のとおりです。

@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){...}

私がそれを行うことを考えた1つの方法は、ExceptionHandlerを使用することです。

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

しかし、例外のmessageを制御することはできません。また、このExceptionが将来のリリースでスローされるかどうかもわかりません

22
royB

エラー処理に関するSpringBootのドキュメント: http://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#boot-features-error-handling 。 JSONを制御する1つの方法は、タイプErrorAttributes@Beanを追加することです。

@Bean
ErrorAttributes errorAttributes() {
    return new MyErrorAttributes();
}
9
Dave Syer

AccessDeniedHandlerを実装する

@Override
public void handle(HttpServletRequest request, HttpServletResponse response,
        AccessDeniedException accessDeniedException) throws IOException, ServletException {
    response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
    try {
        ObjectMapper mapper = new ObjectMapper();
        SomeJsonModel jsonResponse =new SomeJsonModel();
        mapper.writeValue(response.getOutputStream(), jsonResponse);
    } catch (Exception e) {
        throw new ServletException();
    }
}

SomeJsonModelは、独自のPOJO /モデルクラスになり、リソースサーバー構成でそのアクセス拒否ハンドラーを制御および追加できます。

`

@Override
public void configure(HttpSecurity http) throws Exception {
        http.requestMatchers()
                .antMatchers(SECURED_PATTERN).and().authorizeRequests()
                .antMatchers(HttpMethod.POST,SECURED_PATTERN).access(SECURED_WRITE_SCOPE)
                .anyRequest().access(SECURED_READ_SCOPE).and()
              .exceptionHandling().authenticationEntryPoint(newAuthExceptionEntryPoint())
                .accessDeniedHandler(new MyAccessDeniedHandler());
    }

`

5
Abdul Rab Memon