2011-09-22 64 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