2015-07-10 32 views
10

voglio scrivere alcuni dati per AEM, e il codice qui sotto funziona bene per me in AEM 6.0, ma non in AEM 6.1, tiri sempre un Exception Login come segue:ResourceResolverFactory getServiceResourceResolver getta Eccezione in AEM 6.1

"Login Eccezione quando si ottiene un utente CRX per il servizio: 'writeService'.org.apache.sling.api.resource.LoginException: Impossibile derivare il nome utente per il pacchetto group.tti.commons-service [395] e sub service writeService "

OSGI Config:

enter image description here

codice nella mia 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) { 
... 
} 

mi sto perdendo qualcosa sul AEM 6.1?

+0

sto supponendo che il riferimento alla resourceResolverWriter qui è un errore di battitura. Altrimenti questo codice non sarebbe nemmeno compilato. –

+0

Codice aggiornato nel post originale. –

risposta

15

Con il consiglio di Justin, ho provato e trovato la soluzione. Pubblicare così può essere utile per gli altri.

Obiettivo: Per scrivere dati/nodi ai contenuti (in particolare a/etc/userdata) quando un utente accede a

Possiamo raggiungere questo obiettivo in 2 modi (in entrambi i casi, l'utente deve essere un 'sistema. utente ')

processo 1:

Fase 1: utente del sistema Usa in-built in configurazione OSGi. In OSGI selezionare Apache Sling Servizio User servizio di mapping

group.abc.commons-service: writeService = oauthservice (dove 'oauthservice' è un utente del sistema)

Fase 2: Assegnare l'utente del sistema delle autorizzazioni per accedi alla cartella dei contenuti.

enter image description here

Vedete le utenti del sistema a CRX in:/home/utenti/sistema

Processo 2:

Passaggio 1: Creare un nuovo utente di sistema. per fare questo

Aprire http://localhost:4502/crx/explorer/index.jsp

login come amministratore> Apri 'Amministrazione utenti> Selezionare 'Crea sistema User'> Invio 'user id'> Premi il pulsante verde (non sarà possibile se un pulsante Salva :)

ho creato l'utente "abcwriteservice"

Passo 2: Vai autorizzazioni e per l'utente 'abcwriteservice' dare autorizzazioni per accedere alla cartella in cui si desidera scrivere. (In questo esempio:/etc/userdata) enter image description here

Passaggio 3: Aprire la console OSGI e andare a "Servizio di mappatura utente servizio Apache Sling" per definire il mapping utente-servizio. Ad esempio: 'group.commons-service: writeService = abcwriteservice'

enter image description here

Fase 4: Nel codice, ho aggiunto il parametro in più, come:

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

In AEM 6.1, gli utenti del servizio devono essere utenti del sistema, il che significa in effetti che il loro nodo nel JCR è di tipo rep: SystemUser. Questi utenti non possono utilizzare per accedere normalmente, solo per processi in background. L'utente amministratore è non un utente di sistema, quindi non è possibile utilizzare l'utente amministratore in un mapping utente del servizio come questo. Devi creare un nuovo utente di sistema e assegnare loro le autorizzazioni appropriate.

Se desideri saperne di più sullo sfondo di questo cambiamento, dai un'occhiata a https://issues.apache.org/jira/browse/SLING-3854.

+0

Come possiamo creare un nuovo utente di sistema? –

+0

@suren La mia raccomandazione è questo strumento di controllo di accesso per AEM https://github.com/Netcentric/accesscontroltool – santiagozky

-2

invece di fare come sessione:

adminSession = resourceResolverWriter.adaptTo(Session.class);` 

sessione make come qui di seguito, si spera Accesso eccezione non si verificherà

final Session session; 
session= resourceResolver.adaptTo(Session.class); 

questo accada perché resourceResolverWriter non è oggetto implicito.

+1

Non penso che possiamo assegnare nuovamente un valore alla sessione una volta definito definitivo. Ad ogni modo, ho aggiornato il codice nel mio post originale. –

+1

Questo non è corretto. Vedi le risposte di Surendra e di Giustizia. –