Pac4j-播放customHttpErrorHandler问题

问题描述 投票:0回答:1

我在 playframework java 项目中有自己的接口 HttpErrorHandler 实现,我在实现中管理 4XX 错误,但是我在 CustomHttpErrorHandler 中设置的 403,401 视图没有显示,因为在到达处理程序之前,它们进入 Pac4j 而不是我自己的页面,它显示空白的白页,我无法将它们放入安全模块中的 PlayHttpActionAdapter.INSTANCE.getResults().put() 中,因为我必须向请求提供视图,并且无法访问模块中的请求。 实现 HttpErrorHandler 的 CustomHttpErrorHandler 类

protected CompletionStage<Result> onForbidden(RequestHeader request, String message) {
    logger.debug("forbiden");
    return CompletableFuture.completedFuture(
            forbidden(views.html.errors.error403.render(profileManagerService.getProfilesWithHeader(request, configu).getProfiles())));
}
protected CompletionStage<Result> onUnauthorized(RequestHeader request, String message) {
    logger.debug("unauthorized");
    return CompletableFuture.completedFuture(
            unauthorized(views.html.errors.error401.render(profileManagerService.getProfilesWithHeader(request, configu).getProfiles())));

}
then these two methods are called in public CompletionStage<Result> onClientError(
        RequestHeader request, int statusCode, String message) for each 401 and 403 codes, 

自定义处理程序在配置中正确设置,因为 404 页面显示正确 但是 401 和 403 被 pac4j 拦截,日志永远不会显示

我在这里做什么?

#pac4j #playframework

java playframework pac4j
1个回答
0
投票

我找到了答案。 我提供了自定义 HttpActionAdabter 使用与 PlayHttpActionAdabter 相同的代码 但在 adabt 方法的第一个位置添加这段代码

@Override
public Result adapt(final HttpAction action, final WebContext context) {
    Http.RequestBuilder requestBuilder = new Http.RequestBuilder();
    Http.Request request = requestBuilder.path(context.getPath()).build();
    logger.warn(request.toString());
    logger.warn(SecurityModule.configu.getClients().findClient("CustomFormClient").toString());
    if(results.isEmpty()) {
        results.put(HttpConstants.UNAUTHORIZED, unauthorized(views.html.errors.error401.render(profileManagerService.getProfiles(request, SecurityModule.configu).getProfiles()).toString()).as((HttpConstants.HTML_CONTENT_TYPE)));
        results.put(HttpConstants.FORBIDDEN, forbidden(views.html.errors.error403.render(profileManagerService.getProfiles(request, SecurityModule.configu).getProfiles()).toString()).as((HttpConstants.HTML_CONTENT_TYPE)));
    }
    logger.warn(results.toString());

如您所见,我使用上下文 getpath 构建了一个请求,这足以达到目的

© www.soinside.com 2019 - 2024. All rights reserved.