java - 有关使用@PreAuthorize 时抛出 Access Denied 异常的方法的信息

标签 java spring rest spring-security

我们已经使用 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/

相关文章:

spring - 带有点(.)的Spring MVC @PathVariable被截断

java - 从rest api下载文件而不需要window.open

java - AbstractSecurityWebApplicationInitializer 与 AbstractAnnotationConfigDispatcherServletInitializer

java - 如何找到一部分网格的坐标?

java - <R extends TableRecord<R>> 在 Java 中是什么意思?

spring - ElasticsearchItemReader 不断读取相同的记录

http - 客户端应该如何将 facebook 访问 token 传递给服务器?

java - 如何使用 Java 在 Mongo 中添加和删除数组中的元素?

java - Specification/Predicate 根据实例类型 Spring 搜索不同的字段

spring - applicationContext 找不到 Servlet 上下文的 Controller