[英]Alfresco SSO with Cookie
我想將Alfresco與我當前的登錄系統(LDAP服務器)集成。 我可以成功地集成LDAP身份驗證,但是,我想使用外部登錄頁面並讓Alfresco讀取cookie以記錄用戶(cookie將包含用戶名和密鑰,可用於驗證他們是否已登錄使用LDAP服務器)。
我查看了SDK附帶的示例,但似乎沒有辦法在沒有密碼的情況下登錄用戶。
我正在研究外部認證子系統,並看到CAS指南,但這看起來有點矯枉過正,我不確定我是否了解所發生的一切或為什么所有這些都需要我的情況。
在Exernal子系統中探索之后,我看到它使用了“SimpleAcceptOrRejectAllAuthenticationComponentImpl”,它覆蓋了身份驗證功能。 在該函數中,它通過“setCurrentUser”函數對用戶進行身份驗證,但這依賴於“accept”的值被設置為true。 我瀏覽了Alfresco源代碼,查看了WEB-INF / classes / alfresco / subsystems / Authentication / external下的文件,但是我無法找到如何調用setAccept函數。 經過一些谷歌搜索我發現了這個例子 。
看起來他們設置了一個過濾器,通過SimpleAcceptOrRejectAllAuthenticationComponentImpl對象記錄用戶,他們顯式調用setAccept(true)。 我還沒有嘗試過,但是他們的wiki說web.xml文件需要編輯,Alfresco Dev在另一篇文章中說過Alfresco v3.2之后不需要的東西(我使用的是v3.4.3)。 這是走下去的正確途徑嗎?
我聽說另一個想法就是編寫我自己的Authenticator子系統,但我沒有看到任何文檔,並且不知道如何為外部子系統調用“setAccept”函數,我覺得我會拍攝在黑暗中。
關於如何根據外部webapp創建的cookie登錄用戶的想法(在同一個域上 - 我已經能夠讀取cookie,我只是不知道如何在沒有密碼的情況下對用戶進行身份驗證)?
我想我會為遇到同樣問題的人發布解決方案。
第1步:創建一個過濾器,當有人試圖點擊您的某個網址時執行該過濾器。 創建過濾器后,將其編譯並打包在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 / share / 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:對share-config-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並嘗試一下。 希望這會讓你走上正軌。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.