web-dev-qa-db-fra.com

ResourceResolverFactory getServiceResourceResolver lève une exception dans AEM 6.1

Je souhaite écrire des données dans AEM. Le code ci-dessous fonctionne correctement pour moi dans AEM 6.0, mais pas dans AEM 6.1. Lève toujours une exception de connexion de la manière suivante:

" Exception de connexion lors de l'obtention d'un utilisateur CRX pour le service: 'writeService'.org.Apache.sling.api.resource.LoginException: impossible de dériver le nom d'utilisateur pour le groupe group.tti.commons-service [395] et le sous-service writeService "

Config OSGI:

enter image description here

Code dans ma classe:

import javax.jcr.Session;
import org.Apache.sling.api.resource.ResourceResolver;
import org.Apache.sling.api.resource.ResourceResolverFactory;
....
@Reference
private ResourceResolverFactory factory;
private ResourceResolver resourceResolverWriter;
private static Session adminSession;
...
...
Map<String, Object> param = new HashMap<String, Object>();        
    param.put(ResourceResolverFactory.SUBSERVICE, "writeService");
try {
  resourceResolverWriter = factory.getServiceResourceResolver(param);            
  adminSession = resourceResolverWriter.adaptTo(Session.class);
...
} catch (LoginException e) {
...
}

Est-ce que je manque quelque chose sur AEM 6.1?

12
Suren Konathala

Sur les conseils de Justin, j'ai essayé et trouvé la solution. Poster ainsi peut être bénéfique pour les autres.

Objectif: écrire des données/nœuds dans le contenu (en particulier dans/etc/userdata) lorsqu'un utilisateur se connecte.

Nous pouvons y parvenir de deux manières (dans tous les cas, l'utilisateur doit être un «utilisateur du système»)

Processus 1:  

Étape 1: Utiliser un utilisateur système intégré dans la configuration OSGI. Dans OSGI, sélectionnez Service de mappeur d’utilisateur du service Apache Sling

group.abc.commons-service: writeService = oauthservice (où 'oauthservice' est un utilisateur du système)

Étape 2: Attribuez à cet utilisateur du système les autorisations nécessaires pour accéder au dossier de contenu.

enter image description here

Vous voyez les utilisateurs du système dans CRX à:/home/users/system

Processus 2:

Étape 1: Créez un nouvel utilisateur du système. pour faire ça

Ouvrir http: // localhost: 4502/crx/Explorer/index.jsp

Connectez-vous en tant qu'administrateur> Ouvrez 'Administration des utilisateurs> Sélectionnez' Créer un utilisateur système '> Entrez "ID utilisateur"> Appuyez sur le bouton vert (vous ne verrez pas de bouton de sauvegarde :)

J'ai créé "abcwriteservice" utilisateur

Étape 2: Allez dans Autorisations, et pour l'utilisateur 'abcwriteservice', donnez Autorisations pour accéder au dossier où vous souhaitez écrire. (Dans cet exemple:/etc/userdata) enter image description here

Étape 3: Ouvrez la console OSGI et accédez à "Service du mappeur d'utilisateurs du service Apache Sling" pour définir le mappage utilisateur-service. Par exemple: 'group.commons-service: writeService = abcwriteservice'

enter image description here

Étape 4: Dans le code, j'ai ajouté un paramètre supplémentaire, comme: 

Map<String, Object> param = new HashMap<String, Object>();        
    param.put(ResourceResolverFactory.SUBSERVICE, "writeService");

    try {
        resourceResolverWriter = factory.getServiceResourceResolver(param);            

        if (resourceResolverWriter == null)
            throw new Exception("Could not obtain a CRX User for the Service:'writeService'");

        Node usersRootNode = adminSession.getNode("/etc/userdata/users");
19
Suren Konathala

Dans AEM 6.1, les utilisateurs de service doivent être des utilisateurs du système, ce qui signifie que leur nœud dans le JCR est de type rep: SystemUser. Ces utilisateurs ne peuvent pas être utilisés pour se connecter normalement, uniquement par des processus en arrière-plan. L'utilisateur admin est not un utilisateur système. Vous ne pouvez donc pas utiliser cet utilisateur admin dans un mappage d'utilisateur de service comme celui-ci. Vous devez créer un nouvel utilisateur système et lui attribuer les autorisations appropriées.

Si vous souhaitez en savoir plus sur l'historique de cette modification, consultez https://issues.Apache.org/jira/browse/SLING-3854 .

21
Justin Edelson

De même, si vous planifiez une future migration vers AEM 6.2, envisagez d’utiliser ACS Commons pour faciliter la création et la disponibilité des utilisateurs du système. Cela élimine tout ce processus manuel qui peut être sujet à des erreurs.

https://Adobe-consulting-services.github.io/acs-aem-commons/features/ensure-service-users/index.html

0
Jose Berciano