Expand my Community achievements bar.

Guidelines for the Responsible Use of Generative AI in the Experience Cloud Community.
SOLVED

Get Current User by Using Jackrabbit

Avatar

Former Community Member

Hello All,

I am trying to get the current user that is logged in by using Jackrabbit, and based on that information have a page redirect to a new page. I was using this tutorial as a starting point http://helpx.adobe.com/experience-manager/using/developing-aem-osgi-bundles-jackrabbit.html.

I was able to get the bundle to work, so I began to edit the code to get the current user that is logged in. However, it keeps returning that the admin user is logged in, even when I log out and log in with another user.

Here is the code that I am using:

package com.aem.users; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.io.StringWriter; import java.util.Iterator; import java.util.List; import java.util.ArrayList; import java.util.HashMap; import java.util.Map; import javax.jcr.Repository; import javax.jcr.SimpleCredentials; import javax.jcr.Node; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import org.apache.jackrabbit.commons.JcrUtils; import javax.xml.transform.Transformer; import javax.xml.transform.TransformerFactory; import javax.xml.transform.dom.DOMSource; import javax.xml.transform.stream.StreamResult; import org.apache.felix.scr.annotations.Component; import org.apache.felix.scr.annotations.Service; import javax.jcr.RepositoryException; import org.apache.felix.scr.annotations.Reference; import org.apache.jackrabbit.commons.JcrUtils; import javax.jcr.Session; import javax.jcr.Node; //Sling Imports import org.apache.sling.api.resource.ResourceResolverFactory ; import org.apache.sling.api.resource.ResourceResolver; import org.apache.sling.api.resource.Resource; //Jackrabbit User APIs import org.apache.jackrabbit.api.JackrabbitSession ; import org.apache.jackrabbit.api.security.user.Group; import org.apache.jackrabbit.api.security.user.UserManager  ; import org.apache.jackrabbit.api.security.user.User; import  org.apache.jackrabbit.api.security.user.Authorizable ; //This is a component so it can provide or consume services @Component @Service public class SearchUser2Impl implements SearchUsers2 { /** Default log. */ protected final Logger log = LoggerFactory.getLogger(this.getClass()); private Session session; private java.util.Iterator<Authorizable> users = null ; //Inject a Sling ResourceResolverFactory @Reference private ResourceResolverFactory resolverFactory; @Override public int getCQUsers2() { try { int num = 0; //Invoke the adaptTo method to create a Session ResourceResolver resourceResolver = resolverFactory.getAdministrativeResourceResolver(null); session = resourceResolver.adaptTo(Session.class); //Create a UserManager instance from the session object UserManager userManager = resourceResolver.adaptTo(UserManager.class); /* to get the current user */ Authorizable auth = userManager.getAuthorizable(session.getUserID()); String us = auth.getID(); log.info(us); /* to get the groups it is member of */ Iterator<Group> groups = auth.memberOf(); while (groups.hasNext()) { Group g = groups.next(); String id2 = g.getID(); if(id2.equalsIgnoreCase("nbadmin")){ log.info("User is in admin group"); num = 1; }else if(id2.equalsIgnoreCase("nbuser")){                   log.info("User is in user group"); num = 2; }else { log.info("User is not in either group"); } log.info("User belongs to: "+id2); } // Log out session.logout(); return num ; } catch(Exception e) { log.info("CQ ERROR: "+e.getMessage())  ; } return 0; } }

In the code, I am returning an integer based on what group a user is in, and then using that integer to redirect to a new page. 

If anyone could provide any help, or point me in the right direction it would be greatly appreciated.

1 Accepted Solution

Avatar

Correct answer by
Level 10

When you edited your code - you used:

ResourceResolver resourceResolver = resolverFactory.getAdministrativeResourceResolver(null);
  session = resourceResolver.adaptTo(Session.class);
             
  //Create a UserManager instance from the session object
  UserManager userManager = resourceResolver.adaptTo(UserManager.class);
     
  /* to get the current user */
  Authorizable auth = userManager.getAuthorizable(session.getUserID());

 

This will always return admin because ResourceResolver resourceResolver = resolverFactory.getAdministrativeResourceResolver(null) returns admin.  If you want to log in as another user - you should use:
 

Map<String, Object> param = new HashMap<String, Object>();
param.put(ResourceResolverFactory.SUBSERVICE, "datawrite");
ResourceResolver resolver = null;

try {
           
    //Invoke the adaptTo method to create a Session used to create a QueryManager
 resolver = resolverFactory.getServiceResourceResolver(param);
    session = resolver.adaptTo(Session.class);

To learn how to use the getServiceResourceResolver() method to log in as another AEM user - see this article:

http://helpx.adobe.com/experience-manager/using/querying-experience-manager-sling.html

View solution in original post

2 Replies

Avatar

Correct answer by
Level 10

When you edited your code - you used:

ResourceResolver resourceResolver = resolverFactory.getAdministrativeResourceResolver(null);
  session = resourceResolver.adaptTo(Session.class);
             
  //Create a UserManager instance from the session object
  UserManager userManager = resourceResolver.adaptTo(UserManager.class);
     
  /* to get the current user */
  Authorizable auth = userManager.getAuthorizable(session.getUserID());

 

This will always return admin because ResourceResolver resourceResolver = resolverFactory.getAdministrativeResourceResolver(null) returns admin.  If you want to log in as another user - you should use:
 

Map<String, Object> param = new HashMap<String, Object>();
param.put(ResourceResolverFactory.SUBSERVICE, "datawrite");
ResourceResolver resolver = null;

try {
           
    //Invoke the adaptTo method to create a Session used to create a QueryManager
 resolver = resolverFactory.getServiceResourceResolver(param);
    session = resolver.adaptTo(Session.class);

To learn how to use the getServiceResourceResolver() method to log in as another AEM user - see this article:

http://helpx.adobe.com/experience-manager/using/querying-experience-manager-sling.html

Avatar

Former Community Member

Thank you for the quick reply. I will give that code a try and look into that article.