使用Java EE 8 Security-api登录Wildfly群集

时间:2019-07-02 13:24:59

标签: java wildfly java-security jsf-2.3 wildfly-cluster

我们正尝试使用JEE8安全性API创建wildfly 16高可用性集群。项目可以很好地用作独立应用程序,但不能作为群集!我们收到了infispan NotSerializableException。

我们有一个带有jsf 2.3,CDI 2.0和Soteria的wildfly 16独立应用程序。 作为独立服务器运行良好。 现在,我们希望将此配置作为独立的wildfly-cluster运行。 野蜂来了,他们彼此认识。

但是,当我们调用应用程序时,会出现以下异常: java.lang.IllegalArgumentException:org.infinispan.commons.marshall.NotSerializableException:org.glassfish.soteria.servlet.RequestData

如果需要,我们可以发布整个堆栈跟踪。

如果我们要从web.xml中删除“可分发”,则它可以正常工作,但是我们无法在实例之间共享会话。

我们缺少一些配置吗?还是我们还有另一个误会?

谢谢您的帮助


@AutoApplySession 
@LoginToContinue(loginPage = "/login.xhtml", errorPage = "", useForwardToLogin = true)
@ApplicationScoped
public class CustomAuthenticationMechanism implements HttpAuthenticationMechanism {

    @Inject
    private CustomIdentityStore identityStore;

    ...
}

@Model
public class LoginBean implements Serializable {

    public void login() {
        FacesContext context = FacesContext.getCurrentInstance();
        Credential credential = new CustomCredential(username, password);

        AuthenticationStatus status = securityContext.authenticate(
                (HttpServletRequest) externalContext.getRequest(),
                (HttpServletResponse) externalContext.getResponse(),
                withParams()
                        .credential(credential)
                        .newAuthentication(false)
                        .rememberMe(true)
        );
    ...
    }
}


web.xml:
...
distributable
...

从2019年7月3日开始编辑:

正如我现在所看到的,问题出在Soteria Impementation中。 我在github上找到了以下提交:“ https://github.com/eclipse-ee4j/soteria/commit/fd9a29c4452f99b426dabc296ec759d36766a56f”。 我现在的问题是,什么时候可以生效? 要实现对资源的基于角色的访问以及将未经身份验证的用户重定向到自定义登录页面,有哪些替代方案?

1 个答案:

答案 0 :(得分:1)

似乎需要在群集的服务器实例之间复制org.glassfish.soteria.servlet.RequestData类型的对象。复制通过在一侧串行化对象并在另一侧再次反序列化该对象来进行。这就解释了为什么代码可以在非集群环境中工作。

但是,此类似乎未实现java.io.Serializable。您是否在会话范围内的任何对象中使用RequestData