允许 quarkus-oidc 自定义 403 的响应正文

Posted

技术标签:

【中文标题】允许 quarkus-oidc 自定义 403 的响应正文【英文标题】:Allow quarkus-oidc to customize response body of 403 【发布时间】:2021-12-28 06:43:48 【问题描述】:

我想在 quarkus oidc 应用中自定义 403/401 的响应体。 我已经尝试了很多方法来实现它,但无法做到。在 Spring boot 中也可以轻松实现。

【问题讨论】:

【参考方案1】:

使用声明式安全性(@RolesAllowed, @Authenticated...),违反身份验证的错误将作为安全扩展引发的异常处理,然后使用标准 JAXRS exception mapping 机制映射这些异常。

这意味着,您唯一需要修改这些错误的响应,就是为您想要的特定异常创建一个异常映射器。在 Quarkus 安全中,相关的例外是:io.quarkus.security.ForbiddenExceptionio.quarkus.security.UnauthorizedException 分别对应 403401 错误。

403/Forbidden 错误的示例映射器:

import io.quarkus.security.ForbiddenException;

import javax.annotation.Priority;
import javax.ws.rs.core.Response;
import javax.ws.rs.ext.ExceptionMapper;
import javax.ws.rs.ext.Provider;

@Provider//register as JAXRS provider
@Priority(1)//override the build-int mapper(which has 5001 prio)
public class ForbiddenExceptionMapper implements ExceptionMapper<ForbiddenException> 
  @Override
  public Response toResponse(ForbiddenException exception) 
    return Response.status(Response.Status.FORBIDDEN)
      .entity(new MyErrorObject("ERR_NO_ACCESS","Sorry access forbidden"))
      .build();
  

请注意,您的异常映射器需要具有正确的 @Priority 值(值越低,prio 越高)因为 Quarkus 已经为这些异常捆绑了映射器(在 quarkus-resteasy 扩展内),因此您需要提供具有更高优先级的映射器来覆盖它们。这些内置映射器实际上负责您看到的 401/403 响应。

【讨论】:

非常感谢。这对我很有帮助。

以上是关于允许 quarkus-oidc 自定义 403 的响应正文的主要内容,如果未能解决你的问题,请参考以下文章

具有自定义授权者和 CORS 间歇性 200 然后 403 然后 200 的 AWS API 网关 ...奇怪

如何从 403 页面获取网站图标

Django - 自定义 403 模板

自定义 403 禁止使用重写条件

自定义 403 错误页面未加载 CSS

Google 自定义搜索:iOS 中的 403 错误