我们已经使用 Spring security 来保护我们的 rest 端点。每个 rest 资源都使用 @PreAuthorize 注释进行注释。当调用者无权访问他为 Spring 安全请求的资源时,会抛出 org.springframework.security.access.AccessDeniedException 异常。 我们有一个异常映射器,它向客户端返回带有适当错误代码 403 的消息。
public class AccessDeniedExceptionMapper implements ExceptionMapper<AccessDeniedException> {
private static final Logger LOGGER = LoggerFactory.getLogger(AccessDeniedExceptionMapper.class);
/* (non-Javadoc)
* @see javax.ws.rs.ext.ExceptionMapper#toResponse(java.lang.Throwable)
*/
@Override
public Response toResponse(AccessDeniedException exception) {
LOGGER.debug("Access is denied: {}",exception.getMessage());
ResponseBuilder bldr = Response.status(Status.FORBIDDEN);
bldr.entity("Access is denied").type(MediaType.TEXT_PLAIN_TYPE);
return bldr.build();
}
}
现在,是否可以获取有关实际抛出此异常的方法 [在本例中为 someMethod] 的信息? 这个想法是根据客户访问的资源向客户抛出自定义异常。
@PreAuthorize("hasRole('ACTN_START_STOP_DB') and hasPermission(#databaseId, {'ACTN_START_STOP_DB'})")
@Path("/db")
public DatabaseOperation someMethod(){
}
最佳答案
您可以使用以下注释将 HttpHeaders 对象注入(inject)映射器:
@Context
HttpHeaders headers;
从那里您可能能够提取所需的上下文数据。
关于java - 有关使用@PreAuthorize 时抛出 Access Denied 异常的方法的信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25058112/