写入 JCR (JackRabbit) [Magnolia] 时出现 AccessDeniedException

Posted

技术标签:

【中文标题】写入 JCR (JackRabbit) [Magnolia] 时出现 AccessDeniedException【英文标题】:AccessDeniedException when writing into JCR (JackRabbit) [Magnolia] 【发布时间】:2015-06-16 08:45:20 【问题描述】:

我为 geoIP 本地化编写了一个请求过滤器。它的工作方式是我请求外部服务进行本地化,然后将信息写入 JCR,写入缓存/存储的专用工作区。

在作者实例上这是可行的,但在公共实例上我经常收到 AccessDeniedException。我可能需要通过 JCR 进行身份验证,我也尝试过,使用 magnolia.properties 文件中的凭据:

magnolia.connection.jcr.userId = username
magnolia.connection.jcr.password = password

这个验证码:

Session session = MgnlContext.getJCRSession(WORKSPACE_IP_ADDRESSES);
session.impersonate(new SimpleCredentials("username", "password".toCharArray()));

我有 this xml 来引导过滤器和一个 FilterOrdering 任务,配置如下:

tasks.add(new FilterOrderingTask("geoIp", new String[]  "contentType", "login", "logout", "csrfSecurity",
            "range", "cache", "virtualURI" ));

我错过了什么?

在公共实例上写入 Magnolia 中的 JCR 的正确方法是什么?

【问题讨论】:

【参考方案1】:

是的,那行不通:D

您的过滤器是在 Magnolia 的过滤器链中配置还是直接在 web.xml 中配置?它需要存在于过滤器链中,并且需要在安全过滤器之后的某个位置进行配置,以便用户已经通过身份验证。 然后你可以简单地调用MgnlContext.getJCRSession("workspace_name") 来访问 repo 并做任何你需要的事情。

HTH, 一月

【讨论】:

我在过滤器链中配置了过滤器,我在问题中添加了更多信息。我还从头开始重新部署所有内容,并看到过滤器排序失败info.magnolia.module.InstallContextImpl : > Could not sort filter geoIp. It should be positioned after [contentType, login, logout, csrfSecurity, range, cache, virtualURI] 您好 Jan,根据文档,我配置了过滤器,它现在位于 servlet 过滤器之后,因此在负责 AccessDenied 的 securityCallback 过滤器之后。在我的公共实例上它仍然不起作用,我仍然得到一个 AccessDeniedException。 还是公共实例根本不允许写? 不,作为匿名用户,你不能写。要么验证用户身份,要么需要在MgnlContext.doInSystemContext(new Op()...) 等系统上下文中执行写入操作,但是如果您这样做,请格外小心您所写的内容。你不想让任何人在你的公共回购中写任何东西。

以上是关于写入 JCR (JackRabbit) [Magnolia] 时出现 AccessDeniedException的主要内容,如果未能解决你的问题,请参考以下文章

将我的 POJO 保存到 Jackrabbit JCR 的最佳方法是啥?

JCR 基本概念

JCR 长耳兔分页

JackRabbit Oak:我的应用程序需要很长时间才能启动/重新启动

Apache Jackrabbit 和 Jackrabbit Oak 有啥区别?

Jackrabbit仓库的运维管理