Expand my Community achievements bar.

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.