2017-02-21 6 views
2

J'essaie d'utiliser WSO2 5.3.0 comme serveur d'identification.Impossible d'utiliser WSO2 comme serveur d'identification lorsque mon application s'exécute dans JBOSS EAP 7.0

Mon application s'exécute dans JBOSS EAP 7.0 et WSO2 s'exécute dans Tomcat qui l'accompagne.

J'ai suivi ce document de ws02 et capable de faire SSO avec succès lorsque l'exemple d'application s'exécute dans tomcat. Mais lorsque je déploie la même application sur JBOSS EAP 7.0, j'obtiens cette erreur lorsque j'appuie sur l'URL de l'application. ERROR [io.undertow.request] (tâche par défaut-2) UT005023: Demande de gestion d'exception à /travevlocity.com: java.lang.IllegalStateException: UT010041: Le contexte de servlet a déjà été initialisé, vous ne pouvez l'appeler que procédé à partir d'un ServletContainerInitializer ou un ServletContextListener à io.undertow.servlet.spec.ServletContextImpl.ensureNotInitialized (ServletContextImpl.java:778) à io.undertow.servlet.spec.ServletContextImpl.addListener (ServletContextImpl.java:653) à io .undertow.servlet.spec.ServletContextImpl.addListener (ServletContextImpl.java:632) à org.wso2.carbon.identity.sso.agent.SSOAgentFilter.init (SSOAgentFilter.java:57)

Dans WSO2, voici la méthode init de SSOAgentFilter.

public void init(FilterConfig fConfig) 
       throws ServletException 
      { 
       try 
        { 
         SSOAgentConfigs.initConfig(fConfig); 
         SSOAgentConfigs.initCheck(); 
         samlSSOManager = new SAML2SSOManager(); 
         openIdManager = new OpenIDManager(); 
         fConfig.getServletContext().addListener("org.wso2.carbon.identity.sso.agent.saml.SSOAgentHttpSessionListener"); 
        } catch(SSOAgentException e){ 
         LOGGER.log(Level.SEVERE, "An error has occurred", e); 
         throw e; 
        } 
      } 

Je pense que le problème est avec EAP 7.0 JBOSS qui utilise la mise en œuvre comme undertow servlet api. Voici l'extrait de code de ServletContextImpl de undertow.

@Override 
    public void addListener(final Class<? extends EventListener> listenerClass) { 
     ensureNotInitialized(); 
     ensureNotProgramaticListener(); 
     if (ApplicationListeners.listenerState() != NO_LISTENER 
       && ServletContextListener.class.isAssignableFrom(listenerClass)) { 
      throw UndertowServletMessages.MESSAGES.cannotAddServletContextListener(); 
     } 
     InstanceFactory<? extends EventListener> factory = null; 
     try { 
      factory = deploymentInfo.getClassIntrospecter().createInstanceFactory(listenerClass); 
     } catch (Exception e) { 
      throw new IllegalArgumentException(e); 
     } 
     final ListenerInfo listener = new ListenerInfo(listenerClass, factory); 
     deploymentInfo.addListener(listener); 
     deployment.getApplicationListeners().addListener(new ManagedListener(listener, true)); 
    } 

Avant d'ajouter un programme d'écoute, ils vérifient si le ServletContext est initialisé ou non. Et s'il est déjà initialisé, nous ne pouvons pas y ajouter d'écouteur. Mais dans l'implémentation de Tomcat ou d'autres conteneurs, cela n'est pas vérifié.

D'où cela fonctionne bien là-bas.

Y at-il quelque chose que nous pouvons faire pour résoudre ce problème? Je ne peux utiliser que Jboss EAP 7.0 comme serveur dans mon application. S'il vous plaît aider.

+0

J'ai la même question. As-tu eu des indices dans cette direction? – quma

Répondre

0

JBoss EAP 7.0 n'utilise pas Tomcat comme conteneur de servlet comme dans les versions précédentes. Cela pourrait être la raison de l'incompatibilité. Toutefois, l'utilisation d'une version plus récente de la dépendance permettra de résoudre ce problème.

<dependency> 
     <groupId>org.wso2.carbon.identity.agent.sso.java</groupId> 
     <artifactId>org.wso2.carbon.identity.sso.agent</artifactId> 
     <version>5.1.3</version> 
</dependency> 

Vous pouvez essayer la dernière version de l'échantillon ici, sso-agent-sample