【问题标题】:Thorntail MP JWT / Undertow: required authenticationThorntail MP JWT / Undertow:需要身份验证
【发布时间】:2019-07-13 21:17:13
【问题描述】:

我正在尝试使用 JWT 身份验证在 thorntail 中设置 JAX-RS 服务。一切正常(我可以注入Principal 并且用户设置正确),除了在身份验证失败的情况下,仍然会在没有任何 401-HTTP-Header 的情况下发送答案。我所做的是:

  • 已将 @LoginConfig(authMethod = "MP-JWT", realmName = "my-domain") 添加到我的 Application-Class 中
  • 配置安全域

    security:
      security-domains:
        my-domain:
          jaspi-authentication:
            login-module-stacks:
              roles-token-stack:
                login-modules:
                  jwt-jaspi-login-module:
                  code: org.wildfly.swarm.microprofile.jwtauth.deployment.auth.jaas.JWTLoginModule
                  flag: required
          auth-modules:
            http:
              code: org.wildfly.extension.undertow.security.jaspi.modules.HTTPSchemeServerAuthModule
              module: org.wildfly.extension.undertow
              flag: required
              login-module-stack-ref: roles-token-stack
    
  • 配置的 JWT 特定的东西(似乎可以工作,所以我在这里跳过)

我还需要做什么才能使其正常工作?我需要向我的端点添加任何注释吗?正如我所说,我想在身份验证失败的情况下返回 401。

到目前为止,我发现:JASPICAuthenticationMechanism.isMandatory 需要返回 true 才能使其正常工作。如果是这种情况,JWTAuthMechanism.sendChallenge 会在JWTAuthMechanism.authenticate 失败后触发,因此会向客户端发送 401。但我不知道,在什么情况下isMandatory 会返回 true。

感谢您在这种情况下的任何帮助!

【问题讨论】:

    标签: security jwt undertow jaspic thorntail


    【解决方案1】:

    第一,安全域的配置不是 100% 正确的。这是对 YAML 的一部分的修复:

          roles-token-stack:
            login-modules:
            - login-module: jwt-jaspi-login-module
              code: org.wildfly.swarm.microprofile.jwtauth.deployment.auth.jaas.JWTLoginModule
              flag: required
    

    两个,确实需要在 JAX-RS 资源上使用常见的 Java EE 注释(@RolesAllowed、@DenyAll、@PermitAll)。

    【讨论】:

    • 我更改了安全域的配置并在端点上添加了一个@DenyAll...但仍然没有运气在身份验证失败时获得 401。 JWTLoginModule 被调用(也被旧配置调用),我通过在login() 中设置断点来检查它。此方法会引发 LoginException,在我看来应该会导致 401?
    • 在这一点上,我没有看到任何明显的错误。你在某个地方有一个最小但完整的复制器吗?也可以在这里查看几个 MP JWT 测试:github.com/rhoar-qe/thorntail-test-suite/tree/master/…
    • 我尝试了测试套件,如果与 arquillian 一起运行,它可以正常工作。但是,如果我在我的 IDE 中使用org.wildfly.swarm.Swarm 运行它,然后尝试访问http://localhost:8080/denied,则返回码是 200 而不是 401。我无法使用 Maven 和thorntail:run 尝试它,因为我总是得到 [ INFO] 启动 uberjar 错误:无法访问 jarfile,我不知道如何解决此问题。使用 arquillian 运行它和独立运行它有什么区别?
    • 在 IDE 中运行 Swarm 类是非常错误的(主要是因为它不运行 uberjar,而是尝试从类路径重建相同的类加载环境,这实际上不起作用)。您可以按照thorntail.io/posts/thorntail-runner 中的描述尝试Runner 至于mvn thorntail:run,这在测试套件中不起作用,因为thorntail-maven-plugin 没有配置,如果我没记错的话。
    • 我正在尝试让 Runner 工作,但这似乎有点困难。每次我启动它时,都会花费很多时间(> 1h!)直到抛出错误消息。而且因为我必须配置一个特定的存储库并且我在代理后面,所以我可能需要尝试一些... :-)
    【解决方案2】:

    解决方案(感谢 Ladicek,参见下面的 cmets):

    如果您想使用 MP JWT,请不要以 Swarm 开头,如果以 thorntail:run 开头,请不要忘记设置标志 useUberJar。

    【讨论】:

      猜你喜欢
      • 2017-05-17
      • 2020-07-25
      • 2019-05-08
      • 1970-01-01
      • 1970-01-01
      • 2020-03-18
      • 2020-01-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多