javax.jcr.AccessDeniedException 使用 Apache Oak,使用 MongoDB 使用 JBoss Wildfly

javax.jcr.AccessDeniedException with Apache Oak with MongoDB on JBoss Wildfly

每当我尝试访问 jcr 会话中的根节点时,我都会遇到异常

javax.jcr.AccessDeniedException: Root node is not accessible

我们有以下设置:JBoss wildfly 作为应用程序服务器,apache oak 1.3.2 我们使用来自 Spring 框架的 JcrTemplate 使用代码管理 jcr 会话:

    jcrTemplate.execute(new JcrCallback() {
                        @Override
                        public Object doInJcr(Session session) throws IOException, RepositoryException {
                            Node rootNode = session.getRootNode();
}
    }

尽管在单元测试中我在应用程序服务器环境中访问根节点没有问题,但我面临访问被拒绝的问题。

我提到创建 JCR 会话工厂需要用户名和密码,这些用户名和密码委托给特定于应用程序服务器的 JAAS 组件。我已经使用 JBoss 中的添加用户脚本添加了用户名。另一个提到的是 apache oak 在后面使用 MongoDB,我在 JBoss 中没有对它进行任何配置。所有连接都使用应用程序类路径中的 Java monogodb 驱动程序进行管理。

你对这个问题有什么建议吗? 如果您需要更多信息,请随时询问

谢谢

授予对根节点的访问权限的一种方法是在 jboss 内部配置,在其配置文件中,一个安全域将处理 Apache Oak 为获取用户而进行的 JAAS 调用。我jboss 8.2.0 我配置了一个,但是好像用不了。解决方法是为 apache oak 配置自定义安全提供程序。像这样:

Jcr jcr = new Jcr(new Oak(nodeStore)); // configure security jcr.with(configureSecurityProvider());

然后你必须像这样在你的 configureSecurityProvider()) 方法中向你的 jcr 用户授予管理员权限,就像这样(注意 PermissionConstants class 与不同权限):

Set<String> adminNames = new HashSet<String>(); adminNames.add(environment.getProperty("jcr.user")); ConfigurationParameters configurationParameters = ConfigurationParameters.of(PermissionConstants.PARAM_ADMINISTRATIVE_PRINCIPALS, adminNames); SecurityProvider securityProvider = new SecurityProviderImpl(); AuthorizationConfigurationImpl authorizationConfiguration = AuthorizationConfigurationImpl.class.cast( securityProvider.getConfiguration(AuthorizationConfiguration.class)); authorizationConfiguration.setParameters(configurationParameters);