如何在WildFly中设置应用程序级别SAM

时间:2015-08-04 02:13:26

标签: wildfly jaspic

我之前有一些代码正在使用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?source=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"/>

然而它没有效果,在模块中放置一个断点并没有显示它被击中。

另外,我在找不到这样做的方式,就像在glassfish-web.xml中那样在WildFly,但这可能是另一个问题

<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。

1 个答案:

答案 0 :(得分:2)

  

&#34;的HttpServlet&#34;不是Glassfish特定的

这是正确的,AFAIK这是一个标准的标识符,可以说明autem模块将在Java EE中注册哪个子系统。但是,只有其他一个有效的价值,并且&#34; soap&#34;在它(不确定)。

  

WildFly可能有所不同吗?

不,它是standard way

  

并设置<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

然后将recommended放入<jboss-web> <security-domain>jaspitest</security-domain> </jboss-web>

   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));

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

或者,有一种the following方式来激活JASPIC:

io.undertow.servlet.ServletExtension

您需要从validateRequest

执行该操作

很遗憾JBoss需要激活JASPIC。但是上面显示的方法之一应该真的有效。我刚刚在WildFly 9.0的股票上验证了它们并在那里工作。正确调用测试SAM的"CREATE TABLE " + TABLE_NAME + "(" + COL_ID + " INTEGER PRIMARY KEY," + COL_NAME + " TEXT," + COL_TELP + " TEXT," + COL_REK + " TEXT" + ")"; db.execSQL("DROP TABLE IF EXIST " + TABLE_NAME); 方法。