2011-09-22 52 views
1

我想將Alfresco與我當前的登錄系統(這是一個LDAP服務器)集成在一起。我可以成功集成LDAP身份驗證,但是,我想使用外部登錄頁面並讓Alfresco讀取一個cookie來記錄用戶(該cookie將包含用戶名和可用於驗證其登錄的密鑰與LDAP服務器)。帶Cookie的Alfresco SSO

我看着到與SDK附帶的例子,但似乎並沒有被登錄的用戶沒有密碼的方式。

我正在尋找外部認證子系統,並看到CAS指南,但這似乎是矯枉過正,我不知道我明白了一切正在發生或爲什麼所有這些都是我的情況所需要的。

在Exernal子系統閒逛之後,我看到它使用「SimpleAcceptOrRejectAllAuthenticationComponentImpl」,它覆蓋了認證功能。在該函數中,它通過「setCurrentUser」函​​數來驗證用戶,但依賴於「accept」的值被設置爲true。我仔細查看了Alfresco源代碼,並查看了WEB-INF/classes/alfresco/subsystems/Authentication/external下的文件,但我無法找到setAccept函數如何調用。一些谷歌搜索後,我發現this example

看起來他們設置一個過濾器,記錄用戶在通過SimpleAcceptOrRejectAllAuthenticationComponentImpl對象,他們明確要求setAccept(真)。我還沒有嘗試過,但他們的wiki說web.xml文件需要被編輯,Alfresco Dev在Alfresco v3.2(我正在使用v3.4.3)後不需要在另一篇文章中說過。這是正確的途徑嗎?

我聽說另一個想法是編寫我自己的Authenticator子系統,但我沒有看到任何文檔,也不知道如何調用外部子系統的「setAccept」函數,我覺得我我會在黑暗中拍攝。

有關如何基於由外部webapp創建的cookie登錄用戶的任何想法(它位於相同的域 - 我已經能夠讀取cookie,我只是不知道如何驗證用戶沒有密碼)?

回答

4

我想我會張貼任何解決方案誰有同樣的問題。

第1步:創建當有人試圖進入你的URL的一個將要執行的過濾器。創建過濾器後,將其編譯並打包到jar中,然後將該jar放入alfresco.war和share.war(在「WEB-INF/lib」位置)。這是什麼樣的過濾器代碼會看起來像一個鏤空版本:

package sample.filter; 

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.HttpServletRequestWrapper; 
import javax.servlet.http.HttpSession; 

public class SSOIntegrationFilter implements Filter { 
    private static final String PARAM_REMOTE_USER = "remoteUser"; 
    private static final String SESS_PARAM_REMOTE_USER = SSOIntegrationFilter.class.getName() + '.' + PARAM_REMOTE_USER; 

    @Override 
    public void init(FilterConfig arg0) throws ServletException {} 

    @Override 
    public void destroy() {} 

    @Override 
    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException { 
     HttpServletRequest httpServletRequest = (HttpServletRequest) req; 
     String remoteUser = proprieterayUserIdValidationAndExtractionMethod(req.getParameter(PARAM_REMOTE_USER)); 
     // We've successfully authenticated the user. Remember their ID for next time. 
     if (remoteUser != null) { 
      HttpSession session = httpServletRequest.getSession(); 
      session.setAttribute(SESS_PARAM_REMOTE_USER, remoteUser); 
     } 
     chain.doFilter(new HttpServletRequestWrapper(httpServletRequest) { 
      @Override 
      public String getRemoteUser() { 
       return (String) getSession().getAttribute(SESS_PARAM_REMOTE_USER); 
      } 
     }, res); 
    } 

    private String proprieterayUserIdValidationAndExtractionMethod(String param) { 
     return "admin"; // who to login as, replace with your cookie login code 
    } 
} 

步驟2:配置爲Tomcat認識到這個過濾器的web.xml文件(該礦位於/ usr /共享/ tomcat的/ conf目錄) 。

<filter> 
    <filter-name>Demo Filter</filter-name> 
    <filter-class>sample.filter.SSOIntegrationFilter</filter-class> 
</filter> 

<filter-mapping> 
    <filter-name>Demo Filter</filter-name> 
    <url-pattern>/*</url-pattern> 
</filter-mapping> 

第3步:進行以下修改您的股票配置,custom.xml文件(應位於共享目錄):http://docs.alfresco.com/3.4/index.jsp?topic=%2Fcom.alfresco.Enterprise_3_4_0.doc%2Ftasks%2Fauth-alfrescontlm-sso.html

第4步:更新您的alfresco-global.properties文件與以下信息:

authentication.chain=external1:external,alfrescoNtlm1:alfrescoNtlm 
external.authentication.proxyUserName=X-Alfresco-Remote-User 

然後啓動Alfresco並嘗試它。希望這會讓你走上正軌。

+0

嗨,我做老鄉在這裏提到的步驟,但是當我試圖打開本地主機:8080 \份額則要求密碼。我需要做其他改變嗎?請建議。 – Sam

+0

我有一個外部Web應用程序。用戶通過外部Web應用程序中的LDAP服務器進行身份驗證。 LDAP同步我已經使用了Alfresco並且工作正常。現在,在外部Web應用程序上成功進行身份驗證,我想將用戶重定向到Share應用程序(response.sendRedirect(http:// localhost:8080/share/page),但是登錄頁面即將到來,目前我硬編碼爲「admin 「作爲你在你的代碼中提到的過濾器請幫助我如何實現這一目標 – Sam

+0

這已經有一段時間,因爲我寫這篇文章我的過濾器顯著上升 - 。但高於其核心是proprieterayUserIdValidationAndExtractionMethod方法改爲採取HttpServletRequest和HttpServletResponse的對象。我讀出了HttpServletRequest對象餅乾,也存儲在它的會話。爲了確認驗證,我在Cookie值,我們的身份驗證服務提供一個REST調用過去了。這REST調用告訴過濾器,如果用戶是有效的。所以,你會希望你的身份驗證服務,可以設置cookies或將數據傳遞給共享,它可以用來驗證用戶的識別 – patorjk