Get Current User by Using Jackrabbit | Community
Skip to main content
October 16, 2015
Solved

Get Current User by Using Jackrabbit

  • October 16, 2015
  • 2 replies
  • 3703 views

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.

This post is no longer active and is closed to new replies. Need help? Start a new post to ask your question.
Best answer by smacdonald2008

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

2 replies

smacdonald2008
smacdonald2008Accepted solution
Level 10
October 16, 2015

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

October 16, 2015

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