Veena_07,
I'm using AEM 6.3 SP3.
Sample code written in OSGI R6:
import java.io.IOException;
import java.rmi.ServerException;
import org.osgi.service.component.annotations.Reference;
import org.osgi.service.component.annotations.Component;
import org.apache.sling.api.SlingHttpServletRequest;
import org.apache.sling.api.SlingHttpServletResponse;
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.commons.json.JSONException;
import org.apache.sling.commons.json.JSONObject;
import org.apache.sling.jcr.api.SlingRepository;
import org.apache.sling.jcr.base.util.AccessControlUtil;
import org.apache.sling.settings.SlingSettingsService;
import org.apache.jackrabbit.api.security.user.UserManager;
import org.apache.jackrabbit.api.security.user.User;
import org.apache.jackrabbit.api.security.user.Group;
import javax.jcr.ValueFactory;
import org.osgi.framework.ServiceRegistration;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.jcr.RepositoryException;
import javax.jcr.Session;
import javax.jcr.Value;
import javax.servlet.Servlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.adobe.cq.sightly.WCMResourceOptions;
import com.adobe.granite.security.user.UserProperties;
import com.day.crx.security.token.TokenCookie;
import com.day.crx.security.token.TokenUtil;
import org.apache.jackrabbit.api.security.user.Authorizable;
@Component(service=Servlet.class,
immediate = true,
property={
"sling.servlet.methods=POST",
"sling.servlet.paths=/bin/registration",
"metatype=true"
})
public class RegistrationServlet extends
org.apache.sling.api.servlets.SlingAllMethodsServlet {
public static boolean successFlag = false;
private static final long serialVersionUID = 2598426539166789515L;
private static final Logger LOGGER = LoggerFactory
.getLogger(RegistrationServlet.class);
private static final String AEM_REGN_EXCEPTION = "REGN001";
@Reference
private SlingRepository repository;
@Reference
private UserService userService;
@Reference
private SlingSettingsService slingSettings;
@Reference
private ResourceResolverFactory resolverFactory;
public void bindRepository(SlingRepository repository) {
this.repository = repository;
}
@Override
protected void doPost(SlingHttpServletRequest request,
SlingHttpServletResponse response) throws ServerException,
IOException {
boolean success = false;
String returnMsg = "";
String returnCode = "";
JSONObject jsonObject = new JSONObject();
Session adminSession = null;
ResourceResolver resolver = null;
String redirectReg = "";
try {
try {
LOGGER.error("RegnServlet : Registration Request Received for Params+"
+ request.getParameter("firstName")
+ ",userName->"
+ request.getParameter("userName"));
String firstName = request.getParameter("firstName");
String lastName = request.getParameter("lastName");
String userName = request.getParameter("userName");
String password = request.getParameter("password");
String countryCode = request.getParameter("countryCode");
String countryName = request.getParameter("countryName");
Boolean termConditions=Boolean.valueOf(termCondition);
resolver = getResourceResolver(resolverFactory, "dataWriter");
adminSession = resolver.adaptTo(Session.class);
UserManager userManager = AccessControlUtil.getUserManager(adminSession);
User user = (User) userManager.getAuthorizable(userName);
if (userService.userExists(userName, adminSession)) {
throw new Exception("User already exists, Please Login");
}
user = userManager.createUser(userName, password,
new SimplePrincipal(userName),
"/home/users");
ValueFactory valueFactory = adminSession.getValueFactory();
Value emailValue = valueFactory.createValue(userName);
Value userType = valueFactory.createValue("external");
Value givenName = valueFactory.createValue("test");
Value familyName = valueFactory.createValue("test2"));
user.setProperty("./profile/givenName", givenName);
user.setProperty("./profile/familyName", familyName);
user.setProperty("profile/" + UserProperties.EMAIL,
emailValue);
user.setProperty("profile/userType", userType);
adminSession.save();
AuthenticationInfo authnInfo = null;
try {
LOGGER.info("RegnServlet : create token and return");
authnInfo = TokenUtil.createCredentials(request,
response, repository, userName, true);
} catch (RepositoryException e) {
LOGGER.error(
"RegnServlet : Repository error authenticating user: {} ~> {}",
userName, e);
} finally {
LOGGER.info("RegnServlet : In Finally");
}
if (authnInfo != null) {
redirectReg = loginSucceeded(request, response,
authnInfo, adminSession, resObj);
LOGGER.info("redirectReg" + redirectReg);
}
success = true;
} catch (RepositoryException e) {
returnMsg = e.getMessage();
returnCode = AEM_REGN_EXCEPTION;
LOGGER.error("RegnServlet : error", e);
} catch (Exception e) {
returnMsg = "Please try later";
returnCode = AEM_REGN_EXCEPTION;
LOGGER.error("AEM server error",
e);
e.printStackTrace();
}
if (success) {
response.setStatus(HttpServletResponse.SC_OK);
try {
jsonObject.put("successReg", redirectReg);
} catch (JSONException e) {
LOGGER.warn("RegnServlet Unable to write success json");
}
response.getWriter().write(jsonObject.toString());
response.flushBuffer();
} else {
// Error response
response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
try {
jsonObject.put("errorCode", returnCode);
jsonObject.put("errorDetail", returnMsg);
} catch (JSONException e) {
LOGGER.warn("RegnServlet Unable to write error json");
}
response.getWriter().write(jsonObject.toString());
response.flushBuffer();
}
}
}
private String loginSucceeded(HttpServletRequest request,
HttpServletResponse response, AuthenticationInfo authInfo, Session adminSession, Response resObj) {
TokenCookie tokenCookie = TokenCookie.fromRequest(request);
if (tokenCookie != null) {
TokenCookie.setCookie(response, "register-token",
tokenCookie.toString(), 63072000, "/",
request.getServerName(), true, false);
}
String resource = "/en.html";
return resource;
}
public void includeResource(SlingHttpServletResponse customResponse,
String script,
String dispatcherOptions,
String resourceType,
WCMResourceOptions wcmResourceOptions){
}
public ResourceResolver getResourceResolver(final ResourceResolverFactory resolverFactory,
final String subServiceName) throws LoginException {
final Map<String, Object> param = new HashMap<>();
param.put(ResourceResolverFactory.SUBSERVICE, subServiceName);
return resolverFactory.getServiceResourceResolver(param);
}
}