我在 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
我找到了答案。 我提供了自定义 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 构建了一个请求,这足以达到目的