2014-07-08 62 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