4

我之前在 Glassfish 上有过一些代码,但我想将它移植到 WildFly。

但是,我似乎无法让 WildFly 调用该模块。初始化ServletContextListener模块如下

AuthConfigFactory.getFactory()
            .registerConfigProvider(new OpenIdConnectModuleConfigProvider(options, null),
             "HttpServlet", getAppContext(sce), null);

"HttpServlet"不是 Glassfish 特定的,似乎在https://github.com/wildfly/wildfly/blob/master/undertow/src/main/java/org/wildfly/extension/undertow/security/jaspi/JASPIAuthenticationMechanism.java 中被引用?来源=cc

Glassfish 不需要<logon-config>阻止web.xml并且在 WildFly 中放置任何变体都不起作用(如预期的那样)

我怀疑的另一个地方是我如何计算应用程序上下文标识符。对于 Glassfish 我有

private String getAppContext(final ServletContextEvent sce) {

    return sce.getServletContext()
        .getVirtualServerName() + " "
            + sce.getServletContext()
                .getContextPath();
}

WildFly 会有所不同吗?虽然我在https://github.com/rdebusscher/secSpikeWeb/blob/master/src/main/java/org/omnifaces/security/jaspic/core/Jaspic.java#L300中也看到了类似的代码

我也试过添加到standalone.xml这个块

<security-domain name="jaspi" cache-type="default">
  <authentication-jaspi>
    <login-module-stack name="dummy">
      <login-module code="Dummy" flag="optional"/>
    </login-module-stack>
    <auth-module code="org.wildfly.extension.undertow.security.jaspi.modules.HTTPSchemeServerAuthModule" flag="required"/>
  </authentication-jaspi>
</security-domain>

并设置<default-security-domain value="jaspi"/>

但是它没有任何效果,并且在模块中放置断点也没有表明它被命中。

此外,在WildFly中,我找不到一种方法来执行以下操作,glassfish-web.xml但这可能是另一个问题

<security-role-mapping>
    <role-name>users</role-name>
    <group-name>https://helloworld</group-name>
</security-role-mapping>

代码相当大,但它的要点可以在

https://github.com/trajano/openid-connect/tree/openid-connect-1.0.1/openid-connect-jaspic-module

https://github.com/trajano/openid-connect/tree/openid-connect-1.0.1/openid-connect-jaspic-sample

注意我在应用程序级别寻找它,而不是设置全局服务器 JASPI。

4

1 回答 1

2

“HttpServlet”不是 Glassfish 特定的

没错,AFAIK 这是一个标准标识符,表示将在 Java EE 中的哪个子系统上注册 auth 模块。但是只有另一个有效值,那就是其中带有“肥皂”的东西(不确定)。

WildFly 会有所不同吗?

不,这是标准方式

并设置<default-security-domain value="jaspi"/>

推荐的方式应该是这样的standalone.xml

<security-domain name="jaspitest" cache-type="default">
    <authentication-jaspi>
        <login-module-stack name="dummy">
            <login-module code="Dummy" flag="optional"/>
        </login-module-stack>
        <auth-module code="Dummy"/>
    </authentication-jaspi>
</security-domain>

然后将以下内容放入WEB-INF/jboss-web.xml

<jboss-web>
    <security-domain>jaspitest</security-domain>
</jboss-web>

应该足够了。这是我在 WildFly 8.2 和 9.0 上使用的,也是 Java EE 示例项目使用的。但是设置默认域也应该像您一样真正起作用,并且您的激活码也足够接近,所以我不确定上述是否会对您的情况产生影响。

或者,有一个JBoss 特定的编程方式来激活 JASPIC:

   String securityDomain = "other";

        IdentityManager identityManager = deploymentInfo.getIdentityManager();
        if (identityManager instanceof JAASIdentityManagerImpl) {
            try {
                Field securityDomainContextField =
JAASIdentityManagerImpl.class.getDeclaredField("securityDomainContext");
                securityDomainContextField.setAccessible(true);
                SecurityDomainContext securityDomainContext =
(SecurityDomainContext)
securityDomainContextField.get(identityManager);

                securityDomain =
securityDomainContext.getAuthenticationManager().getSecurityDomain();

            } catch (NoSuchFieldException | SecurityException |
IllegalArgumentException | IllegalAccessException e) {
                throw new RuntimeException(e);
            }
        }

        ApplicationPolicy applicationPolicy = new
ApplicationPolicy(securityDomain);
        JASPIAuthenticationInfo authenticationInfo = new
JASPIAuthenticationInfo(securityDomain);
        applicationPolicy.setAuthenticationInfo(authenticationInfo);
        SecurityConfiguration.addApplicationPolicy(applicationPolicy);

        deploymentInfo.setJaspiAuthenticationMechanism(new
JASPIAuthenticationMechanism(securityDomain, null));
        deploymentInfo.setSecurityContextFactory(new
JASPICSecurityContextFactory(securityDomain));

你需要从一个io.undertow.servlet.ServletExtension

JBoss 需要激活 JASPIC,这很遗憾。但是上面显示的方法之一应该确实有效。我刚刚在股票 WildFly 9.0 上验证了它们,它在那里工作。测试SAM的validateRequest方法被正确调用。

于 2015-08-04T11:22:43.487 回答