我有自定义类型节点et:document
,需要在jackrabbit存储库中的某些用户之间共享。
但是当我尝试以超级用户模仿并为每个用户分配一个已定义的属性sharedWithMe
时,获取failed login exception
。
以应用程序用户身份登录,
SimpleCredentials credentials = new SimpleCredentials(userName, password.toCharArray());
Session session = repository.login(credentials, "default");
尝试共享文档(添加到用户节点的属性)
SimpleCredentials credentials = new SimpleCredentials("superuser", "superuser".toCharArray());
Session adminUser = session.impersonate(credentials);
UserManager userManager = ((JackrabbitSession) adminUser).getUserManager();
for(String userID : users) {
User user = (User) userManager.getAuthorizable(userID);
Value value = vf.createValue(docPath);
Value[] sharedDocsPath = user.getProperty("sharedWithMe");
int shareDocIndex = 0;
Value[] revisedSharedDocPath = null;
if (null != sharedDocsPath && sharedDocsPath.length > 0) {
revisedSharedDocPath = new Value[sharedDocsPath.length + 1];
for (Value v : sharedDocsPath) {
revisedSharedDocPath[shareDocIndex] = v;
shareDocIndex++;
}
revisedSharedDocPath[shareDocIndex] = value;
} else {
revisedSharedDocPath = new Value[1];
revisedSharedDocPath[shareDocIndex] = value;
}
user.setProperty("sharedWithMe", revisedSharedDocPath);
}
获得例外:
Caused by: javax.security.auth.login.FailedLoginException: attempt to impersonate denied for superuser
at org.apache.jackrabbit.core.security.authentication.DefaultLoginModule.impersonate(DefaultLoginModule.java:306)
at org.apache.jackrabbit.core.security.authentication.AbstractLoginModule.login(AbstractLoginModule.java:330)
at org.apache.jackrabbit.core.security.authentication.LocalAuthContext.login(LocalAuthContext.java:86)
repository.xml中的安全标记信息
<Security appName="EnterpriseManager">
<SecurityManager class="org.apache.jackrabbit.core.DefaultSecurityManager">
<WorkspaceAccessManager class="org.apache.jackrabbit.core.security.simple.SimpleWorkspaceAccessManager"/>
</SecurityManager>
<AccessManager class="org.apache.jackrabbit.core.security.DefaultAccessManager"/>
<LoginModule class="org.apache.jackrabbit.core.security.authentication.DefaultLoginModule">
<param name="adminId" value="superuser"/>
</LoginModule>
</Security>
<Workspace name="${wsp.name}">
<WorkspaceSecurity>
<AccessControlProvider class="org.apache.jackrabbit.core.security.authorization.principalbased.ACLProvider">
<param name="omit-default-permission" value="true" />
</AccessControlProvider>
</WorkspaceSecurity>
</Workspace>
使用JCR 2.0,Jackrabbit 2.6
答案 0 :(得分:1)
首先需要向校长授予模仿然后冒充。(虽然有点奇怪)
boolean isGranted = impersonation.grantImpersonation(repoUser.getPrincipal());
System.out.println("Granted impersonation for user? " + isGranted);
SimpleCredentials adminCredentials = new SimpleCredentials(suUser, suPassword.toCharArray());
session = (JackrabbitSession) session.impersonate(adminCredentials);