CMIS connector error: IllegalArgumentException: Authentication provider does not implement AuthenticationProvider

Bonjour,

Après plusieurs utilisation successive et massive d'un processus utilisant des connecteurs CMIS, alors que cela fonctionnait normalement, subitement, une exception est levée par ces connecteurs.

Cf. log:
----------------------------------
19-Oct-2021 14:12:30.484 SEVERE [ConnectorExecutor-91] org.bonitasoft.engine.log.technical.TechnicalLoggerSLF4JImpl.log THREAD_ID=3577 | HOSTNAME=my_hostname | TENANT_ID=101 | org.bonitasoft.engine.commons.exceptions.SBonitaRuntimeException : "java.lang.IllegalArgumentException: Authentication provider does not implement AuthenticationProvider!"
org.bonitasoft.engine.commons.exceptions.SBonitaRuntimeException: java.lang.IllegalArgumentException: Authentication provider does not implement AuthenticationProvider!
at org.bonitasoft.engine.connector.impl.ConnectorExecutorImpl.lambda$execute$0(ConnectorExecutorImpl.java:156)
at java.base/java.util.concurrent.CompletableFuture$AsyncSupply.run(CompletableFuture.java:1700)
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
at java.base/java.lang.Thread.run(Thread.java:834)
Caused by: java.lang.IllegalArgumentException: Authentication provider does not implement AuthenticationProvider!
at org.apache.chemistry.opencmis.client.bindings.impl.CmisBindingImpl.<init>(CmisBindingImpl.java:104)
at org.apache.chemistry.opencmis.client.bindings.CmisBindingFactory.createCmisAtomPubBinding(CmisBindingFactory.java:171)
at org.apache.chemistry.opencmis.client.runtime.CmisBindingHelper.createAtomPubBinding(CmisBindingHelper.java:103)
at org.apache.chemistry.opencmis.client.runtime.CmisBindingHelper.createBinding(CmisBindingHelper.java:61)
at org.apache.chemistry.opencmis.client.runtime.SessionFactoryImpl.getRepositories(SessionFactoryImpl.java:118)
at org.apache.chemistry.opencmis.client.runtime.SessionFactoryImpl.getRepositories(SessionFactoryImpl.java:107)
at org.bonitasoft.connectors.cmis.cmisclient.AbstractCmisClient.getRepositories(AbstractCmisClient.java:89)
at org.bonitasoft.connectors.cmis.cmisclient.AbstractCmisClient.getRepositoryByName(AbstractCmisClient.java:234)
at org.bonitasoft.connectors.cmis.cmisclient.AbstractCmisClient.connect(AbstractCmisClient.java:76)
at org.bonitasoft.connectors.cmis.AbstractCMISConnector.connect(AbstractCMISConnector.java:84)
at org.bonitasoft.engine.core.connector.impl.SConnectorAdapter.connect(SConnectorAdapter.java:83)
at org.bonitasoft.engine.connector.impl.ConnectorExecutorImpl$ExecuteConnectorCallable.call(ConnectorExecutorImpl.java:253)
at org.bonitasoft.engine.connector.impl.ConnectorExecutorImpl$ExecuteConnectorCallable.call(ConnectorExecutorImpl.java:213)
at com.bonitasoft.engine.connector.impl.ConnectorExecutorTimedOut$1.call(ConnectorExecutorTimedOut.java:78)
at com.bonitasoft.engine.connector.impl.ConnectorExecutorTimedOut$1.call(ConnectorExecutorTimedOut.java:73)
at org.bonitasoft.engine.connector.impl.ConnectorExecutorImpl.lambda$wrapForStats$1(ConnectorExecutorImpl.java:165)
at org.bonitasoft.engine.connector.impl.ConnectorExecutorImpl.lambda$execute$0(ConnectorExecutorImpl.java:153)
... 4 more

----------------------------------

Pour quelles raisons possibles cette exception qui semble relative à une authentification apparaît-elle subitement ?

Nos serveurs Alfresco sont sur AWS. Sur cette architecture, pour des raisons de sécurité, il a été mis en place un WAF (Web Application Firewall).
Nous avons demandé à l'équipe en charge des serveurs Alfresco et du WAF, s'il y avait eu blocage des appels en provenance de Bonita et la réponse est que ce n'est pas le cas.

Après le redémarrage de Bonita, le processus et ses connecteurs s'est remis a fonctionner normalement.

Comment expliquer que ce blocage soit levé à partir du moment où Bonita est redémarré ?
En effet, les tests que l'on a fait montrent que tout de suite après le redémarrage, le processus remarche.

Comment éviter que le processus plante si jamais il y avait des problèmes de ce type?

J'utilise la version: Bonita-Subscription-7.10.1.

J'ai aussi vérifier les classloaders et j'ai bien une seule version des lib dans le claosslader de mon process, comme spécifié dans la doc:   https://documentation.bonitasoft.com/bonita/2021.2/version-update/migrate-from-an-earlier-version-of-bonita#_cmis_connector

chemistry-opencmis-client-api-1.1.0.jar
chemistry-opencmis-client-bindings-1.1.0.jar
chemistry-opencmis-client-impl-1.1.0.jar
chemistry-opencmis-commons-api-1.1.0.jar
chemistry-opencmis-commons-impl-1.1.0.jar

J'ai trouvé une question avec les mêmes symptômes et un bug dans la communauté sur ce problème:
https://community.bonitasoft.com/questions-and-answers/authentication-provider-does-not-implement-authenticationprovider
https://bonita.atlassian.net/browse/BBPMC-642

Pouvez-vous m'aider a comprendre comment éviter ce problème qui bloque mon processus?


Merci d'avance,
Cordialement,

 

Bonjour,

En regardant le code source de OpenCMIS, je pencherais pour un problème de map non thread-safe, mais je ne peux pas le jurer.
C'est le comportement "random" qui me fait pencher pour cette idée.

Ou alors un problème de classloader, car le code qui donne ce problème, c'est:

        if (authenticationProvider == null) {
            // create authentication provider and add it session
            String authProviderClassName = sessionParameters.get(SessionParameter.AUTHENTICATION_PROVIDER_CLASS);
            if (authProviderClassName != null) {
                Object authProviderObj = null;

                try {
                    authProviderObj = ClassLoaderUtil.loadClass(authProviderClassName).newInstance();
                } catch (Exception e) {
                    throw new IllegalArgumentException("Could not load authentication provider: " + e, e);
                }

                if (!(authProviderObj instanceof AuthenticationProvider)) {
                    throw new IllegalArgumentException(
                            "Authentication provider does not implement AuthenticationProvider!");
                }
                authenticationProvider = (AuthenticationProvider) authProviderObj;
            }
        }

En particulier la ligne:

if (!(authProviderObj instanceof AuthenticationProvider)) {

Si la classe org.apache.chemistry.opencmis.commons.spi.AuthenticationProvider n'est pas chargée par le même classloader, je pense qu'on peut tomber sur ce problème. Ce serait un problème de conflit de librairies.

Mais dans ce cas, le caractère aléatoire est plus difficile à expliquer...