2014-07-08 24 views
0

请理解,当我说限制访问时,我不限制作者,而是限制我的网站的最终用户。所以请不要告诉我关于CUG(封闭用户组)的信息。如何提供受限访问DAM内容?

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

每当用户(最终用户不是作者)点击下载,他/她能够donwload文件。

我要的是,每当用户点击上面的链接,如果用户已经登录我的网站,或不应该验证,然后允许用户下载该文件。这样做的

一种方法是我写的一个Servlet和地图上面的链接servlet和servlet的中的的doGet认证用户并允许文件下载。但是在这里我没有使用CQ5的RESTful特性。

有没有一种方法,就像我为DAM中的特定文件夹编写身份验证Servlet或筛选器,​​用作身份验证筛选器或其他?我有意义吗?这是可能的还是有任何替代品? CQ推荐什么?

+0

最终用户不是组的最终用户吗? –

+0

不是。他们是普通用户, Facebook或任何社交网站任何输入? – Oliver

+0

你有什么样的用户差异?servlet过滤器可能是提供插件授权机制的一个很好的选择,特别是如果它只是一个边缘案例 –

回答

1

您可以在您的下载页面下创建一个resourceType(即app/components/downloaditem)和一个指向/content/dam中的资产的属性fileReference。然后编写一个servlet来响应那个resourceType,如果文件可以传递给用户,你决定用什么逻辑来决定,如果允许的话,你传递文件(写入响应),如果不是则返回403.

末的下载链接不会是/content/dam/asset1/content/web/downloads/downloadResource

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

此外,这允许你阻止访问/内容/大坝,这你应该无论如何做。

出于好奇,为什么你不想使用CUG?认证的最终用户和编辑一样重要。

+0

所以这个实现可以用CUG完成那么你会推荐哪种方法?你能否详细说明如何使用CUG来完成它? – Oliver

+0

如果你的最终用户在CQ中通过了认证,那么它应该可以工作。并检查他们的权限在一般情况下,你想尽可能限制对/ content/dam的访问 – santiagozky

+0

我对此有点困惑你在我的身份验证Servlet中看到我所做的只是'request.getSession()。getAttribute (“userId”);''我只是检查UserId是否为空** userId是我的外部数据库Oracle中的字段**我不清楚如何使用CUG限制访问正常访问的人DAM通过在浏览器中键入链​​接。 – Oliver

0

正如你想使用吊带功能,使用FilterChain。使用基于用户身份的身份验证阻止请求。 在你的过滤器中,你可以使用逻辑 - 使用值为“Authenticated”的变量。当你做登录时,用你的用户名和密码发送一个额外的值作为“Authenticated”(这表明你的用户不是客人)。在你的过滤器中检查这个条件。

-1

我解决了它的工作。但是这有问题。

我写了一个吊带过滤器并将其映射到我想限制访问的文件夹,所以如果有人呼吁该文件夹或子文件夹/文件的请求通过我的过滤器。

在我的过滤器中,我检查用户是否已登录。 但是,现在出现的问题是,任何想访问此文件夹的人都必须登录到我的应用程序中,使用该应用程序设置会话。而Admin(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 { 

    } 

} 
+0

请提供downvote的原因。不要随意做事。 – Oliver

0
在你的过滤器

,使用 WCMMode.fromRequest(req) 以确定模式WCMMode.DISABLED(上发布实例模式)。如果不是DISABLED,则忽略。 (换句话说,你希望你的过滤器只在WCMMode.DISABLED的请求上执行 - 让author/admins/etc在你的作者实例(EDIT/DESIGN/PREVIEW)上免费注册。可以在作者实例上拥有DISABLED请求,但你希望这些行为与发布实例完全相同 - 也许希望PREVIEW模式也具有相同的行为

+0

我不明白。你能否详细说明一下? – Oliver