在本地 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 阻止之前向经过身份验证的用户添加角色?