AEM 6420 - Lookup JNDI Objects

Goal


Look up JNDI objects in AEM servlet. This post checks if a FQDN (fully qualified domain name)  exists in local OpenLDAP

Package Install

                  http://localhost:4502/bin/experienceaem/jndi/check-user-exists?dn=cn=sreek,ou=People,dc=experienceaem,dc=com





Solution


1) Create a servlet apps.experienceaem.jndi.ListLDAPUsers with the following code

package apps.experienceaem.jndi;

import org.apache.felix.scr.annotations.sling.SlingServlet;
import org.apache.sling.api.SlingHttpServletRequest;
import org.apache.sling.api.SlingHttpServletResponse;
import org.apache.sling.api.servlets.SlingAllMethodsServlet;
import org.apache.sling.servlets.post.JSONResponse;
import org.json.JSONObject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import javax.naming.Context;
import javax.naming.directory.*;
import javax.servlet.ServletException;
import java.io.IOException;
import java.util.Properties;

@SlingServlet(
        label = "Experience AEM - List LDAP Users",
        description = "Experience AEM - List LDAP Users Servlet.",
        paths = { "/bin/experienceaem/jndi/check-user-exists" },
        methods = { "GET", "POST" },
        extensions = { "json" }
)
public class ListLDAPUsers extends SlingAllMethodsServlet{
    private static final Logger log = LoggerFactory.getLogger(ListLDAPUsers.class);

    private static String ldapServer = "localhost:389";
    private static String rootDn = "cn=Manager,dc=experienceaem,dc=com";
    private static String rootPass = "secret";

    @Override
    protected final void doGet(SlingHttpServletRequest request, SlingHttpServletResponse response) throws
                                ServletException, IOException {
        try {
            addJSONHeaders(response);

            JSONObject jsonObject = new JSONObject();

            Properties env = new Properties();
            env.put( Context.INITIAL_CONTEXT_FACTORY,"com.sun.jndi.ldap.LdapCtxFactory" );
            env.put( Context.PROVIDER_URL, "ldap://" + ldapServer);
            env.put(Context.SECURITY_AUTHENTICATION,"simple");
            env.put( Context.SECURITY_PRINCIPAL, rootDn );
            env.put( Context.SECURITY_CREDENTIALS, rootPass );

            String dn = request.getParameter("dn");

            DirContext ctx = new InitialDirContext(env);

            Object user = ctx.lookup(dn);

            if(user != null){
                jsonObject.put(dn, user);
            }

            ctx.close();

            jsonObject.write(response.getWriter());
        } catch (Exception e) {
            log.error("Could not formulate JSON response");
            response.setStatus(SlingHttpServletResponse.SC_INTERNAL_SERVER_ERROR);
        }
    }

    @Override
    protected final void doPost(SlingHttpServletRequest request, SlingHttpServletResponse response) throws
                                ServletException, IOException {
        doGet(request, response);
    }

    public static void addJSONHeaders(SlingHttpServletResponse response){
        response.setContentType(JSONResponse.RESPONSE_CONTENT_TYPE);
        response.setHeader("Cache-Control", "nocache");
        response.setCharacterEncoding("utf-8");
    }
}



No comments:

Post a Comment