Expand my Community achievements bar.

Learn about Edge Delivery Services in upcoming GEM session

Generate reports for a users last log-in in AEM | AEM Community Blog Seeding

Avatar

Administrator

BlogImage.jpg

Generate reports for a users last log-in in AEM by AEMTutorial

Abstract

There are cases where we need to generate reports for a users last log-in in AEM.

I have seen many help blogs but none of them worked for me. Below given an approach which worked for me.

Approach

Utilising 'AuthenticationInfoPostProcessor' service in combination with ACS commons, its going to be easy to generate such reports. This is tested on AEM 6.5 version.

Step1: Deploy below Java code which will capture lastLogin information.


Java class which captures the users last login and update the user node

Note: Modify the conditions as per your project requirement.

--Java class START ---

package yourpackage.core.services;

import java.text.SimpleDateFormat;
import java.util.Date;

import javax.jcr.Session;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.jackrabbit.api.security.user.Authorizable;
import org.apache.jackrabbit.api.security.user.UserManager;
import org.apache.sling.api.resource.LoginException;
import org.apache.sling.api.resource.ResourceResolver;
import org.apache.sling.api.resource.ResourceResolverFactory;
import org.apache.sling.auth.core.spi.AuthenticationInfo;
import org.apache.sling.auth.core.spi.AuthenticationInfoPostProcessor;
import org.osgi.service.component.annotations.Component;
import org.osgi.service.component.annotations.Reference;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

@Component(name = "UserProfileService", service = AuthenticationInfoPostProcessor.class, immediate = true)

public class UserProfileService implements AuthenticationInfoPostProcessor {

/**
* This class generate Last login property of any user profile
*
* @param authenticationinfo
* @param servletrequest
* @param servletresponse
*/

private static final Logger LOGGER = LoggerFactory.getLogger(UserProfileService.class);
@Reference
private ResourceResolverFactory resourceResolverFactory;

@Override
public void postProcess(AuthenticationInfo info, HttpServletRequest request, HttpServletResponse response)
throws LoginException {

/**
* Users last logged in will be his last active time in AEM
* Executed only when it is a logout operation to ensure the last active time is captured
* Ensure to update the code with relevant condition
*/
if ((info != null && info.getAuthType() == null) || (request != null && request.getServletPath() != null
&& (*Your condition 1*))) {
LOGGER.debug("AuthenticationInfo is null. " + "we can skip post processing this request.");
return;
}

ResourceResolver resourceResolver = null;
Session session = null;
UserManager userManager = null;
Authorizable auth = null;

try {
resourceResolver = resourceResolverFactory.getResourceResolver(info);
session = resourceResolver.adaptTo(Session.class);
userManager = resourceResolver.adaptTo(UserManager.class);
auth = userManager.getAuthorizable(session.getUserID());
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSXXX");
//Anonymous users need not be checked
if (auth.getID() != null && (*Your condition 2*)) {
LOGGER.info("Logged in Users log in");
//Profile will have a new property
auth.setProperty("profile/lastLoggedIn", session.getValueFactory().createValue(sdf.format(new Date())));
session.save();
session.logout();
}

} catch (Exception exception) {
exception.printStackTrace();
}
}
}

--Java class END---


In my case I had used below conditions.
(*Your condition 1*) - !request.getServletPath().equals("/system/sling/logout.html")
(*Your condition 2*) - !auth.getID().equals("anonymous")

Read Full Blog

Generate reports for a users last log-in in AEM

Q&A

Please use this thread to ask the related questions.



Kautuk Sahni
0 Replies