当前位置: 首页 > 知识库问答 >
问题:

使用KeyClope获取servlet应用程序中的用户角色

闾丘书
2023-03-14

我正在使用keycloak来保护我的servlet。我必须添加新角色并动态地将它们分配给用户。它使用管理应用编程接口在keycloak中工作,但是我不知道如何在servlet中获得特定用户的角色。

我尝试了这个解决方案,但我得到了空集:

protected void doPost(HttpServletRequest request, HttpServletResponse response) {
...

KeycloakSecurityContext context = (KeycloakSecurityContext)request.getAttribute(KeycloakSecurityContext.class.getName());
    Set<String> roles = AdapterUtils.getRolesFromSecurityContext((RefreshableKeycloakSecurityContext) context);
...
}

共有2个答案

萧胜
2023-03-14

如果servlet受keyclok保护,那么您可以使用以下API获取KeycloakSecurityContext,然后访问角色的Set来修改它。

KeycloakPrincipal principal = (KeycloakPrincipal) request.getUserPrincipal();

 principal.getKeycloakSecurityContext().getToken().getRealmAccess().getRoles().add("Test-Role");

样例servlet请求可能是这样的。

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    @SuppressWarnings("rawtypes")
    KeycloakPrincipal principal = (KeycloakPrincipal)request.getUserPrincipal();
    if (principal != null) {
        //user has a valid session, we can assign role on the fly like this
        principal.getKeycloakSecurityContext().getToken().getRealmAccess().getRoles().add("Test-Role");

        }
}
邵昆琦
2023-03-14

@湿婆的回答对我不起作用。GetRealMacAccess()返回null。我们必须使用以下方法:

KeycloakPrincipal principal = (KeycloakPrincipal) request.getUserPrincipal();

String clientId = "securesite";
principal.getKeycloakSecurityContext().getToken().getResourceAccess(clientId).getRoles();
 类似资料:
  • 我正在尝试在我的Servlet 3.0 Web应用程序中使用Log4j2。即使按照官方留档配置了所有内容,我也无法看到日志。 这是我的web.xml: 我已将log4j2.xml文件放在WEB-INF/classes中: 这是我在类中调用logger的方式: 请告诉我我做错了什么。我甚至尝试过硬编码到log4j2的直接路径.xml,但仍然不起作用。

  • 我正在尝试修改我在网上多个地方找到的KeyClope和Spring Boot教程中的代码(代码看起来已经被复制)。在任何情况下,尽管keybeapt保护正确的url,Spring Security性也很方便,但在尝试检索主体时,它返回为null。这是我的申请表。属性文件: 这是我的安全配置。java文件(教程中的原始文件): 我的web控制器如下所示: 最后,这是我的Maven配置,以防它有所不同

  • 我在应用程序中使用,带有。它工作正常,我在中定义了,然后在我的Config.class我允许根据每个用户的角色访问我感兴趣的endpoint。我在尝试检索我后面的用户信息时遇到问题(姓名、委托人、权限...)。 我读过很多这样的帖子: 如何从钥匙中获取主体斗篷-安全-Spring-引导-应用程序 空指针-当-固定-Spring-引导-Rest-服务-带-键斗篷 但我找不到适合我的。如果使用Secu

  • 我已经确定,最好的方法是使用应用程序拥有的常规驱动器帐户,如下所述: 使用普通Google帐户作为应用程序拥有的帐户 这要求我们为用户获取OAuth2凭据。上面链接的文章链接到了一篇关于这样做的第二篇文章:

  • 问题内容: 我已经使用基于标准的基于wildfly的Keycloak适配器的Keycloak保护了企业应用程序。我面临的问题是,其余的Web服务在被调用时需要知道当前登录的用户名。如何从Keycloak获取登录的用户信息? 我尝试使用,等等。但是没有一个能够提供所需的详细信息。 问题答案: 您从安全上下文中获取所有用户信息。 例: 为了传播安全上下文,您必须具有如下配置的安全域: JBoss /

  • 我做了一个C应用程序,它假设使用Kerberos身份验证来访问HDFS。这个应用程序的webserver也是用C编写的。 我正在尝试使用Kerberos票证在此应用程序中进行透明身份验证。 我使用以下命令对未经授权的用户进行了服务器响应: HTTP/1.1 401未经授权 WWW-认证:协商 浏览器会对标题中的授权字段做出反应,如下所示: 授权:协商Yiecgygkwybbqucoid/jCCA/