![](/img/trans.png)
[英]How Can I implement OAuth2 SSO in a Java Application with Servlet?
[英]How can I trigger OAuth/OpenID authentication on a Java Servlet and add my own roles to the user?
在本地 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 方处理登录,然后验证登录是否有效以及它是哪个用户。
如果我在 HttpMethodConstraint 中包含rolesAllowed = { "debug" }
, rolesAllowed = { "debug" }
触发与 3rd-party auth 服务器的身份验证并正常工作。 但是因为没有一个用户具有与之关联的角色,所以他们没有所需的“调试”角色。 processRequest
方法永远不会到达,用户会收到“禁止”错误页面。
如果我删除或清空约束的rolesAllowed
字段,则不会触发与 3rd-party auth 服务器的身份验证,并且没有可用于识别用户的UserPrincipal
。
我试过在请求到达我的 Servlet 之前放入一个javax.servlet.Filter
来拦截请求,但是如果需要“调试”角色,那么过滤器也不会到达。 我曾希望在用户进行身份验证后拦截请求,然后向用户添加角色、会话变量或我的 servlet 将检查执行各种操作的权限的内容。
我尝试了其他一些没有触发身份验证的组合:
@ServletSecurity(httpMethodConstraints = { @HttpMethodConstraint(value = "GET", emptyRoleSemantic = ServletSecurity.EmptyRoleSemantic.PERMIT)})
和
@ServletSecurity(httpMethodConstraints = { @HttpMethodConstraint(value = "GET", transportGuarantee = ServletSecurity.TransportGuarantee.CONFIDENTIAL)})
没运气。
有没有一种方法可以触发 3rd-party 身份验证,并使用经过身份验证的用户的用户名/用户 ID 获取 UserPrincipal,而无需特定角色? - 或 - 有没有办法在身份验证后但在被 HttpMethodConstraint 阻止之前向经过身份验证的用户添加角色?
我相信 elytrons 角色映射是要走的路。 您可以配置一个 Regex 映射器来将每个角色映射到一个静态角色。 或者使用 group-decoder-mapper 将组名转换为角色。
参见例如: https : //wildfly-security.github.io/wildfly-elytron/blog/regex-role-mapper/
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.