0

请理解,当我说限制访问时,我并不是在限制作者,而是限制我网站的最终用户。所以请不要告诉我关于 CUG(封闭用户组)的事情。

我正在制作一个 CQ5 网站,当用户(最终用户)登录时,主页上有一个链接<a Href="xxx"> Download</a>,xxx 是 DAM 中存在的文件的路径。

每当用户(最终用户不是作者)点击下载时,他/她就可以下载文件。

我想要的是,每当用户点击上面的链接时,它应该验证用户是否登录了我的网站,然后允许用户下载文件。

这样做的一种方法是我编写一个 Servlet 并将上面的链接映射到 Servlet 并在 servlet 的 doGet 中验证用户并允许下载文档。但是在这里我没有使用 CQ5 的 RESTful 特性。

有没有办法,比如我为 DAM 中的特定文件夹编写身份验证 Servlet 或过滤器,充当身份验证过滤器之类的?我还有道理吗?这是可能的还是有任何替代方案?CQ推荐什么?

4

4 回答 4

1

您在下载页面下创建一个具有 resourceType(即app/components/downloaditem)和fileReference指向资产的属性的节点/content/dam。然后编写一个响应该 resourceType 的 servlet,您可以在其中决定是否可以将文件交付给用户,如果允许,则交付文件(将其写入响应),如果不返回 403,则返回 403。

最后下载链接不会是/content/dam/asset1但是/content/web/downloads/downloadResource

您甚至可以利用下载组件(或继承它的组件),以便编辑器可以轻松地为特定下载选择一个文件,只需使用该资源类型注册 servlet。

此外,这允许您阻止对 /content/dam 的访问,无论如何您都应该这样做。

出于好奇,你为什么不想使用CUG?经过身份验证的最终用户既是编辑,也是 CQ 用户。

于 2014-07-08T08:40:18.763 回答
0

在您的过滤器中,用于 WCMMode.fromRequest(req) 确定模式是否为WCMMode.DISABLED(发布实例的模式)。如果没有禁用,则忽略。(换句话说,您希望您的过滤器仅对 WCMMode.DISABLED 的请求执行 - 让作者/管理员/等在您的作者实例(编辑/设计/预览)上自由注册。在作者实例上可能有 DISABLED 请求,但是您希望它们的行为与发布实例完全相同 - 并且可能希望 PREVIEW 模式也具有相同的行为。

于 2014-07-21T17:33:16.397 回答
0

我解决了这个问题。但这有问题。

我编写了一个 sling 过滤器并将其映射到我想限制访问的文件夹,因此如果有人调用该文件夹或任何子文件夹/文件,请求将通过我的过滤器。

在我的过滤器中,我检查用户是否已登录。但是现在出现的问题是,任何想要访问此文件夹的人都必须登录到我的应用程序,并通过该应用程序设置会话。并且管理员(CQ主要作者无法访问文件夹本身。)

管理员必须停止我的捆绑包(具有上述过滤器的那个),然后访问 DAM 文件夹,因为捆绑包中的过滤器阻止 CQ 管理员访问 DAM。有什么快速的解决方案吗?

代码:

package com.xxx.hiresite.filters;

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.apache.felix.scr.annotations.Properties;
import org.apache.felix.scr.annotations.Property;
import org.apache.felix.scr.annotations.Reference;
import org.apache.felix.scr.annotations.sling.SlingFilter;
import org.apache.jackrabbit.api.security.user.Authorizable;
import org.apache.sling.api.resource.ResourceResolver;
import org.apache.sling.api.resource.ResourceResolverFactory;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

@SlingFilter(order = -1000)
@Properties({
    @Property(name="service.pid", value="com.xxx.hiresite.filters.DAMAccessFilter",propertyPrivate=false),
    @Property(name="service.description",value="DAM Documents Authentication Filter", propertyPrivate=false),
    @Property(name="service.vendor",value="Zensar Tech", propertyPrivate=false),
    @Property(name="pattern",value="/content/dam/xxxdocuments/.*", propertyPrivate=false)   
})
public class DAMAccessFilter implements Filter{
    private final Logger log = LoggerFactory.getLogger(this.getClass());



    @Reference
    protected ResourceResolverFactory resolverFactory;

    public void destroy() { 

    }

    public void doFilter(ServletRequest request, ServletResponse response,  FilterChain chain) throws IOException, ServletException {
        // Authentication Filter for the whole application
        log.info("DAMAccessFilter Invoked***************************");

        HttpServletRequest httpServletRequest = (HttpServletRequest)request;
        String path =httpServletRequest.getRequestURI();
        log.info("Request URI ::"+path);
        HttpSession session = httpServletRequest.getSession(false);
        if(session ==null || session.getAttribute("userId")==null)
        {
            log.info("DAMAccessFilter :: Not Logged in");
            HttpServletResponse httpResponse = (HttpServletResponse)response;
            httpResponse.sendError(HttpServletResponse.SC_FORBIDDEN);
        }
        else
        {
            log.info("DAMAccessFilter :: Logged in");
            chain.doFilter(request, response);
            log.info("DAMAccessFilter Done");
        }   

    }

    public void init(FilterConfig config) throws ServletException {

    }

}
于 2014-07-18T08:35:04.120 回答
0

由于您想为此使用吊索功能,请继续使用 FilterChain。使用基于用户身份的身份验证阻止请求。在您的过滤器中,您可以使用逻辑 - 使用值为“已验证”的变量。当您登录时,使用您的用户名并通过发送一个附加变量,其值为“已验证”(这表明您的用户不是访客)。在您的过滤器中检查此条件。

于 2014-07-09T09:39:38.903 回答