请理解,当我说Restricted access时,我不是限制作者,而是限制我网站的最终用户。所以请不要告诉我有关CUG(封闭用户组)的信息。
我正在建立一个CQ5网站,当用户(最终用户)登录时,主页上有一个链接<a Href="xxx"> Download</a>
,xxx是DAM中存在的文件的路径。
每当用户(最终用户不是作者)点击下载时,他/她就可以下载该文件。
我想要的是,每当用户点击上述链接时,它应该验证用户是否登录了我的网站,然后允许用户下载该文件。
这样做的一种方法是编写一个Servlet并将上面的链接映射到Servlet,并在servlet的doGet中对用户进行身份验证并允许文档下载。但是在这里我没有使用CQ5的RESTful特性。
有没有办法,比如我为DAM中的特定文件夹编写身份验证Servlet或过滤器作为身份验证过滤器还是什么?我甚至有意义吗?这有可能还是有替代方案? CQ推荐什么?
答案 0 :(得分:1)
您可以在下载页面下创建一个节点,其中包含resourceType(即app/components/downloaditem
)和指向fileReference
中资源的属性/content/dam
。然后编写一个响应该resourceType的servlet,如果文件可以传递给用户,你决定使用任何逻辑,如果允许,你传递文件(将其写入响应),如果不返回403。
最后,下载链接不会是/content/dam/asset1
,而是/content/web/downloads/downloadResource
您甚至可以利用下载组件(或继承它的组件),以便编辑器可以轻松地为特定下载选择文件,只需使用该resourceType注册servlet。
此外,这允许您阻止访问/ content / dam,您可能应该这样做。
出于好奇,为什么不想使用CUG?经过身份验证的最终用户与编辑人员一样是CQ用户。
答案 1 :(得分:0)
如果您想使用吊索功能,请继续使用FilterChain。使用基于用户身份的身份验证阻止请求。 在您的过滤器中,您可以使用逻辑 - 将值变量用作&#34;经过身份验证的&#34;。当您登录时,使用您的用户名和密码发送一个附加变量,其值为&#34; Authenticated&#34; (显示您的用户不是来宾)。在您的过滤器中检查此条件。
答案 2 :(得分: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 {
}
}
答案 3 :(得分:0)
在您的过滤器中,使用
WCMMode.fromRequest(req)
确定模式是否为WCMMode.DISABLED(发布实例上的模式)。如果没有禁用,则忽略。 (换句话说,你希望你的过滤器只对WCMMode.DISABLED的请求执行 - 让作者/管理员/等在你的作者实例上自由注册(编辑/设计/预览)。可以在作者实例上有DISABLED请求,但是你希望那些行为与发布实例完全一样 - 并且可能希望PREVIEW模式的行为也相同。