Ich möchte zuerst Gruppe erstellen und dann Benutzer und dann möchte ich Benutzer mit getServiceResourceResolver (Karte) oder loginService ("datawrite", null) zur Gruppe hinzufügen.AccessDeniedException, wenn ich Gruppe und Benutzer in aem 6.2 (6.1) programmatisch erstellen?
Ich versuchte folgenden Code, und ich bin immer Ausnahme zum Zeitpunkt der Sitzung speichern (adminSession.save()):
public void addGroupUser(SlingHttpServletRequest request) {
log.info("----------------------------------------> addGroupUser");
String groupName = request.getParameter("groupName");
String userName = request.getParameter("userName");
String password = request.getParameter("password");
Session adminSession = null;
ResourceResolver adminResolver = null;
try {
Map<String, Object> authInfoParam = new HashMap<String, Object>();
authInfoParam.put(ResourceResolverFactory.SUBSERVICE, "datawrite");
adminResolver = resolverFactory.getServiceResourceResolver(authInfoParam);
//adminResolver = resolverFactory.getAdministrativeResourceResolver(null); //deprecated method
adminSession = slingRepository.loginService("datawrite", null);
log.info("----------------------------------------> Session user id = {}",adminSession.getUserID());
// Create UserManager Object
final UserManager userManager = AccessControlUtil.getUserManager(adminSession);
// Create a Group
Group group= null;
if (userManager.getAuthorizable(groupName) == null) {
//adminResolver.refresh();
group = userManager.createGroup(groupName,new SimplePrincipal(groupName),"/home/groups/test");
ValueFactory valueFactory = adminSession.getValueFactory();
Value groupNameValue = valueFactory.createValue(groupName, PropertyType.STRING);
group.setProperty("./profile/givenName", groupNameValue);
//adminResolver.commit();
log.info("----------------------------------------> {} Group successfully created.",group.getID());
} else {
log.info("----------------------------------------> Group already exist..");
}
// Create a User
User user = null;
if (userManager.getAuthorizable(userName) == null) {
//adminResolver.refresh();
user=userManager.createUser(userName, password,new SimplePrincipal(userName),"/home/users/test");
ValueFactory valueFactory = adminSession.getValueFactory();
Value firstNameValue = valueFactory.createValue("Arpit", PropertyType.STRING);
user.setProperty("./profile/givenName", firstNameValue);
Value lastNameValue = valueFactory.createValue("Bora", PropertyType.STRING);
user.setProperty("./profile/familyName", lastNameValue);
Value emailValue = valueFactory.createValue("[email protected]", PropertyType.STRING);
user.setProperty("./profile/email", emailValue);
//adminResolver.commit();
log.info("----------------------------------------> {} User successfully created.",user.getID());
} else {
log.info("----------------------------------------> User already exist..");
}
// Add Users to Group
Group addUserToGroup = (Group)(userManager.getAuthorizable(groupName));
addUserToGroup.addMember(userManager.getAuthorizable(userName));
adminSession.save();
}catch (Exception e) {
log.info("----------------------------------------> Not able to perform User Management..");
log.info("----------------------------------------> Exception.." + e.getMessage());
} finally {
if (adminSession != null && adminSession.isLive()) {
adminSession.logout();
}
if (adminResolver != null)
adminResolver.close();
}
}
Ausnahmeprotokoll ist:
javax.jcr.AccessDeniedException: OakAccess0000: Access denied
at org.apache.jackrabbit.oak.api.CommitFailedException.asRepositoryException(CommitFailedException.java:231)
at org.apache.jackrabbit.oak.api.CommitFailedException.asRepositoryException(CommitFailedException.java:212)
at org.apache.jackrabbit.oak.jcr.delegate.SessionDelegate.newRepositoryException(SessionDelegate.java:670)
at org.apache.jackrabbit.oak.jcr.delegate.SessionDelegate.save(SessionDelegate.java:496)
at org.apache.jackrabbit.oak.jcr.session.SessionImpl$8.performVoid(SessionImpl.java:419)
at org.apache.jackrabbit.oak.jcr.delegate.SessionDelegate.performVoid(SessionDelegate.java:274)
at org.apache.jackrabbit.oak.jcr.session.SessionImpl.save(SessionImpl.java:416)
...
Caused by: org.apache.jackrabbit.oak.api.CommitFailedException: OakAccess0000: Access denied
at org.apache.jackrabbit.oak.security.authorization.permission.PermissionValidator.checkPermissions(PermissionValidator.java:212)
at org.apache.jackrabbit.oak.security.authorization.permission.PermissionValidator.childNodeAdded(PermissionValidator.java:150)
at org.apache.jackrabbit.oak.spi.commit.VisibleValidator.childNodeAdded(VisibleValidator.java:104)
at org.apache.jackrabbit.oak.spi.commit.VisibleValidator.childNodeAdded(VisibleValidator.java:104)
at org.apache.jackrabbit.oak.spi.commit.VisibleValidator.childNodeAdded(VisibleValidator.java:104)
at org.apache.jackrabbit.oak.spi.commit.VisibleValidator.childNodeAdded(VisibleValidator.java:32)
at org.apache.jackrabbit.oak.spi.commit.CompositeEditor.childNodeAdded(CompositeEditor.java:108)
...
Ich habe „Datawrite "Dienstzuordnung mit Systembenutzer in" Apache Sling Service-Benutzerzuordnungsdienst ", der in der OSGI-Konfigurationsverwaltungsoberfläche konfiguriert werden kann.
Bitte geben Sie Ihren Vorschlag und Antworten.
Danke,
Arpit Bora
Es ist keine gute Praxis, dem Benutzer des Dienstes alle Administratorzugriffe zu geben. Dies übertrifft den Zweck, Systembenutzer zu haben und Admin Resource Resolver abzulehnen. Ihr Service-/Systembenutzer sollte nur Rechte zur Unterstützung seiner beabsichtigten Funktionen haben. –
Dank @Ameesh für den Vorschlag, dass Sie Recht haben, ist jede andere Möglichkeit zum Erstellen von Gruppen und Benutzern in aem6.2/6.1 mit der Methode 'getServiceResourceResolver (map)'. – ArpitBora
Wenn Sie versuchen, etwas wiederzuverwenden, das bereits in AEM vorhanden ist, können Sie auf das mit AEM 6 mitgelieferte Communities-Paket verweisen. Es verfügt über einen Benutzer 'communities-user-admin', der über relevanten Zugriff zum Erstellen von Benutzergruppen verfügt verarbeiten. Weitere Informationen zur Verwendung finden Sie in der Dokumentation zu Java - https://docs.adobe.com/docs/en/aem/6-2/develop/ref/javadoc/com/adobe/cq/social/members/endpoints /package-frame.html Der Paketname lautet - 'cq-social-members-api' und kann unter -'/libs/social/members/install/' –