jackrabbit 저장소에서 그룹에 권한을 추가하려고합니다. 나는 "디자이너"그룹이/템플릿 노드에 쓸 수있는 것을 원합니다. 폴더Jackrabbit 그룹 ACL 관리. 그룹 권한이있는 노드에서 노드 추가를 거부했습니다.
첫째, 내가라는 이름의 그룹을 만듭니다 "디자이너"
userManager = jkSession.getUserManager();
Roles[] rolesTable = { Roles.EDITOR, Roles.DESIGNER,
Roles.OPERATOR, Roles.ADMINISTRATOR };
for (Roles role : rolesTable) {
userManager.createGroup(role.toString());
...
및이 그룹/템플릿 노드에 권한을 할당 :
이 노드 (/ 템플릿) 형 NT와 노드입니다 :
p = principalManager.findPrincipals(
Roles.DESIGNER.toString(),
PrincipalManager.SEARCH_TYPE_GROUP)
.nextPrincipal();
Node catalogNode = session.getRootNode().getNode("templates");
AccessControlPolicyIterator accessControlPolicyIterator = accessControlManager
.getApplicablePolicies(catalogNode.getPath());
AccessControlPolicy policy = accessControlPolicyIterator
.nextAccessControlPolicy();
if (polic
y instanceof AccessControlList) {
AccessControlList acl = (AccessControlList) policy;
JackrabbitAccessControlList jackAcl = (JackrabbitAccessControlList) acl;
jackAcl
.addEntry(
p,
new Privilege[] {
accessControlManager
.privilegeFromName(Privilege.JCR_ADD_CHILD_NODES),
accessControlManager
.privilegeFromName(Privilege.JCR_READ),
accessControlManager
.privilegeFromName(Privilege.JCR_WRITE),
accessControlManager
.privilegeFromName(Privilege.JCR_REMOVE_NODE) },
true, null);
이제 사용자를 생성 및 디자이너 그룹에 그에게 회원 수 :
Principal principal = principalManager.findPrincipals(DESIGNER.toString(),
PrincipalManager.SEARCH_TYPE_GROUP).nextPrincipal();
Group roleToAssign = (Group) userManager.getAuthorizable(principal);
user = userManager.createUser(login, password);
roleToAssign.addMember(user);
지금 해당 사용자로 로그인하고 addNode 명을 시도/템플릿
lCredentials = new SimpleCredentials(login, new String(pPassword)
.toCharArray());
}
Repository tmpRepository = null;
try {
tmpRepository = repositoryFactory.getRepository(repositoryParams);
session = tmpRepository.login(lCredentials, pWorkspace);
및/템플릿에 노드를 추가 :..
session.getRootNode()는 getNode ("템플릿") addNode 명을 ("테스트 ","nt : unstructured "); 그러나
는 accessDenied을 던져 :javax.jcr.AccessDeniedException: Access denied.
at org.apache.jackrabbit.core.security.DefaultAccessManager.checkPermission(DefaultAccessManager.java:193)
at org.apache.jackrabbit.core.NodeImpl.addNode(NodeImpl.java:1266)
at org.apache.jackrabbit.core.session.AddNodeOperation.perform(AddNodeOperation.java:111)
at org.apache.jackrabbit.core.session.AddNodeOperation.perform(AddNodeOperation.java:37)
at org.apache.jackrabbit.core.session.SessionState.perform(SessionState.java:216)
at org.apache.jackrabbit.core.ItemImpl.perform(ItemImpl.java:91)
at org.apache.jackrabbit.core.NodeImpl.addNodeWithUuid(NodeImpl.java:1814)
at org.apache.jackrabbit.core.NodeImpl.addNode(NodeImpl.java:1774)
at org.apache.jackrabbit.commons.JcrUtils.getOrAddNode(JcrUtils.java:519)
내가 jackrabbits 그룹에 대한 ACL에 대한 문서를 찾을 수 없습니다. 누군가 나를 도울 수 있습니까? 감사.
여기서 중요한 점은 JCR_NODE_TYPE_MANAGEMENT를 추가하는 것입니다. 주체 기반 ACL을 사용할 필요는 없지만 리소스 ACL은 정상적으로 작동합니다. BTW JCR_WRITE에 이미 JCR_ADD_CHILD_NODES가 포함되어 있으므로 명시 적으로 추가 할 필요가 없습니다. – Dale
"자식 추가"권한이 작동하려면 네 가지 권한이 모두 필요하다는 것을 확인할 수 있습니다. JCR_ADD_CHILD_NODES + JCR_READ + JCR_WRITE + JCR_NODE_TYPE_MANAGEMENT가 있어야합니다. 제 경우에는 자식 노드가 실제 노드 자체를 쓰기 가능하게하지 않고 * 추가 할 수 있도록하고 싶었습니다. 나는 JCR 디자이너가 예상하지 못한 경우라고 생각합니다. "소셜 미디어"세계에서는 콘텐츠 사용자가 "읽을 수"있고 해당 사용자가 댓글을 달 수는 있지만 편집 할 수 없도록하려는 공통 패턴이 있기 때문에 이는 불행한 일입니다. 내가 틀렸다면 나를 교정하십시오. –