1

在本地 Wildfly 服务器上,我有一个简单的 Java servlet,如下所示:

import javax.servlet.annotation.HttpMethodConstraint;
import javax.servlet.annotation.ServletSecurity;
import javax.servlet.http.HttpServlet;

@ServletSecurity(httpMethodConstraints = { @HttpMethodConstraint(value = "GET", rolesAllowed = { "debug" })})
public class DebugServlet extends HttpServlet {

    protected void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");
        try ( PrintWriter out = response.getWriter()) {
            /* TODO output your page here. You may use following sample code. */
            ...
            Principal user = request.getUserPrincipal();
            out.println("<p>" + (user != null ? user.getName() : "No user") + "</p>");
            ...
        }
    }
}

我已经使用 OpenID Connect (OIDC) 和第三方身份验证服务器设置了 Wildfly 的 Elytron v1.17.2 身份验证。如果重要的话,它不是Keycloak 服务器,也不能更改身份验证服务器;使用此身份验证服务器是一项严格的业务要求。auth 服务器有一堆我们想要访问的用户,但是对于我的特定 client_id,没有一个用户具有与他们关联的任何角色,我们希望避免通过 auth 服务器添加角色,因为该过程是......充其量是乏味的。官僚主义的繁文缛节,每一次,每一个用户。我们的最终目标是在该服务器的数据库中拥有我们自己的角色,我们只去第 3 方处理登录,然后验证登录是否有效以及它是哪个用户。

如果我包含rolesAllowed = { "debug" }在 HttpMethodConstraint 中,则第 3 方身份验证服务器的身份验证将被触发并正常工作。但是因为没有一个用户具有与之关联的角色,所以他们没有所需的“调试”角色。该processRequest方法永远不会到达,并且用户会收到“禁止”错误页面。

如果我删除或清空约束的字段,则不会触发与rolesAllowed第三方身份验证服务器的身份验证,并且我们无法使用它来识别用户。UserPrincipal

我已经尝试javax.servlet.Filter在请求到达我的 Servlet 之前将其拦截,但如果需要“调试”角色,则过滤器也不会到达。我曾希望在用户进行身份验证后拦截请求,然后向用户添加角色,或者会话变量,或者我的 servlet 将检查执行各种操作的权限。

我尝试了一些其他没有触发身份验证的组合:

@ServletSecurity(httpMethodConstraints = { @HttpMethodConstraint(value = "GET", emptyRoleSemantic = ServletSecurity.EmptyRoleSemantic.PERMIT)})

@ServletSecurity(httpMethodConstraints = { @HttpMethodConstraint(value = "GET", transportGuarantee = ServletSecurity.TransportGuarantee.CONFIDENTIAL)})

没运气。

有没有一种方法可以触发 3rd-party 身份验证,并使用经过身份验证的用户的用户名/用户 ID 获取 UserPrincipal,而无需特定角色?-或者- 有没有一种方法可以在身份验证之后但在被 HttpMethodConstraint 阻止之前向经过身份验证的用户添加角色?

4

2 回答 2

1

您的自定义过滤器方法不起作用的原因是 elytron 安全框架在调用过滤器链之前很好地处理了这个问题。您可以按照此处(第 3.2.9 节)和此处的说明在 elytron 安全性中尝试自定义角色映射器,以添加一些预定义的角色。

RoleMapper - 在角色被解码为身份之后,可以应用进一步的映射,这可以通过添加或删除特定角色名称来规范化名称的格式。

您显然需要配置 elytron 子系统以使用您的自定义角色映射器。您可以在此处查看 regex-role-mapper 的示例配置(在您的情况下,您需要自定义 RoleMapper 而不是 regex-role-mapper)

于 2021-11-05T19:37:03.437 回答
0

我相信 elytrons 角色映射是要走的路。您可以配置 Regex 映射器以将每个角色映射到一个静态角色。或者使用 group-decoder-mapper 将组名转换为角色。

参见例如:https ://wildfly-security.github.io/wildfly-elytron/blog/regex-role-mapper/

于 2021-11-09T11:01:48.620 回答