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

如何获取javax。servlet。在密钥斗篷身份验证之前调用筛选器

宋涵忍
2023-03-14

我们已经开发了一个REST API使用restease。

基本上,这些REST API是从另一个应用程序内部调用的,endpoint由KeyClope保护。

但有一个endpoint会暴露给外部方(该endpoint也会使用keyCloak进行保护)。

但是,由于外部方无法提供KeyClope身份验证代码,我们已经完成了一个实现,其中客户端使用应用程序生成的身份验证密钥注册,客户端将使用该身份验证密钥调用endpoint。

然后在web过滤器(javax.servlet.过滤器)中,使用thaauth_key我们得到相关的密钥隐藏认证承载令牌。如果需要(例如:令牌过期),我们也调用KeyCloak服务器。一旦它被接收,我们将Autheration令牌添加到web过滤器中的http请求中,并继续到终端应用程序。

但问题是,在Web筛选器之前调用KeyClope身份验证。我想问的是“如何在密钥斗篷身份验证之前调用Web筛选器?”

编辑:

现在我正试图找到一种方法,就像这里提到的。将请求头设置为在密钥斗篷中进行身份验证之前请求。在那里,我可以在身份验证之前接到电话。但我无法在那里设置请求头。

网状物xml

<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns="http://java.sun.com/xml/ns/javaee"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
    version="3.0">
    <display-name>Restful Web Application</display-name>
    <context-param>
        <param-name>resteasy.scan</param-name>
        <param-value>true</param-value>
    </context-param>

    <!-- keycloak -->

    <context-param>
        <param-name>keycloak.config.resolver</param-name>
        <param-value>package.to.HeaderBasedKeycloakConfigResolver</param-value>
    </context-param>

    <security-constraint>
        <web-resource-collection>
            <web-resource-name>REST endpoints</web-resource-name>
            <url-pattern>/ep-name/resource-name</url-pattern>
        </web-resource-collection>
        <auth-constraint>
            <role-name>resource-name</role-name>
        </auth-constraint>
    </security-constraint>

    <!-- more security-constraint -->
    <!-- more security-constraint -->
    <!-- more security-constraint -->

    <login-config>
        <auth-method>KEYCLOAK</auth-method>
        <realm-name>realm-name</realm-name>
    </login-config>

    <security-role>
        <role-name>role-name-for-resource-1</role-name>
        <role-name>role-name-for-resource-2</role-name>
        <!-- more security-role -->
        <!-- more security-role -->
        <!-- more security-role -->
    </security-role>

    <listener>
        <listener-class>
            org.jboss.resteasy.plugins.server.servlet.ResteasyBootstrap</listener-class>
    </listener>

    <servlet>
        <servlet-name>resteasy-servlet</servlet-name>
        <servlet-class>
            org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher
        </servlet-class>
        <init-param>
            <param-name>resteasy.servlet.mapping.prefix</param-name>
            <param-value>/ep-name</param-value>
        </init-param>
    </servlet>

    <servlet-mapping>
        <servlet-name>resteasy-servlet</servlet-name>
        <url-pattern>/ep-name/*</url-pattern>
    </servlet-mapping>

    <filter>
      <filter-name>WebFilter</filter-name>
      <filter-class>package.to.filter.WebFilter</filter-class>
   </filter>

   <filter-mapping>
      <filter-name>WebFilter</filter-name>
      <url-pattern>/desired-ep-name/*</url-pattern>
   </filter-mapping>

</web-app>

共有3个答案

司寇照
2023-03-14

我知道这已经2年了,但我找到了解决这个问题的方法:将您的适配器更改为servlet过滤器,我的是jboss/wildfly,然后添加到web。在过滤器下面添加xml以更改请求或响应。在jboss/wildfly中,身份验证发生在一个阀门中,因此身份验证发生在任何过滤器执行之前。一旦你这么做了,你就可以控制KeyClope什么时候开始工作,并把你的过滤器放在它前面。

网状物xml

<filter>
        <filter-name>Keycloak Filter</filter-name>
        <filter-class>org.keycloak.adapters.servlet.KeycloakOIDCFilter</filter-class>
</filter>
    <filter-mapping>
        <filter-name>Keycloak Filter</filter-name>
        <url-pattern>/restricted/*</url-pattern>
        <url-pattern>/restricted/</url-pattern>
</filter-mapping>

向pom中添加适当版本的keydeposervlet过滤器适配器,并从web中删除所有其他安全约束、身份验证方法等。xml。

史经业
2023-03-14

这可能是因为Tomcat身份验证阀在过滤器之前启动。检查uthenticators.properties文件。您可能需要将筛选器类包装为Valve

金赤岩
2023-03-14

您是否尝试过更改web.xml中元素的顺序(例如将过滤器定义放在servlet定义之前)?

不确定它是否有效,但文档说:“链中过滤器的顺序与web应用程序部署描述符中过滤器映射的顺序相同”

对于servlet和过滤器之间的顺序,该原理也可能是正确的...

 类似资料:
  • 嗨,好几天了,我都被困在这上面了!在使用本指南转换我的react应用程序后,我尝试使用KeyClope对我的electron应用程序进行身份验证。 当我运行'npm运行电子:dev'时,keyCloak会重定向到登录页面。然而,当我运行'npm运行电子:prod'这失败。 来自KeyClope服务器的日志显示: 请注意,重定向_uri是'file:///...“我相信这就是原因。 我也试图改变下面

  • 我需要在自定义密钥斗篷SPI身份验证器中处理用户的取消。我实现了它,它工作得很好。我所需要的是取消登录流程,并从用户点击取消时的乞讨开始 在我的例子中,我得到了登录页面,但URL错误: http://localhost:8080/auth/realms/realm1/login-actions/authenticate?execution=bb1fb7c3-0b59-4a07-b997-b619c

  • 注意:我正在使用Spring Boot 2.1.10和Keycloak 6.0.1,我希望我可以在Web应用程序(MVC)的启动时在基本身份验证和SSO之间进行选择。所以我首先将Spring Security Keycloak与keycloak-spring-boot-starter集成 然后我定义了一个“sso”Spring配置文件和一个默认配置: application.properties是

  • 谁知道如何使用获取id_令牌? 我一直在(Spring,JEE)和postman中与合作。 基本的工作正常,但我需要,因为有一些声明,它们不存在于中,但它们存在于中。 使用库,我可以获得Keycloak上下文,但id_token属性始终为null。 有什么主意吗?

  • 我试图实现一个自定义密钥克拉克身份验证器SPI,用于对外部身份提供程序进行身份验证。用户已经存在于keycloak存储中,我只需要连接到自定义SPI来验证他们。 我正在遵循官方指南https://www.keycloak.org/docs/latest/server_development/index.html#_auth_spi_walkthrough的第8.3节,这与我所需要的非常相似。

  • 我正在尝试配置我的本地键盘斗篷8.0.1实例,以使用谷歌作为身份提供者。我正在按照我在这里找到的说明进行操作。我已经相应地配置了我的身份提供者、领域和客户端。当我点击登录页面时,我看到执行谷歌登录的按钮。然而,当我点击它并浏览谷歌同意页面时,我最终被带回键盘斗篷,看到一个错误,上面写着,在我的键盘斗篷日志中,我看到以下内容: 除了说明中的领域名称外,我没有更改任何内容。知道为什么我会看到此错误吗?