Spring Oauth2
とSpring Pre-post Annotations
をSpring-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
が将来のリリースでスローされるかどうかもわかりません
エラー処理に関する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();
}
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());
}
`