写入 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 的最佳方法是啥?
JackRabbit Oak:我的应用程序需要很长时间才能启动/重新启动