Alfresco SSO与Cookie

时间:2011-09-22 15:11:45

标签: cookies single-sign-on alfresco

我想将Alfresco与我当前的登录系统(LDAP服务器)集成。我可以成功地集成LDAP身份验证,但是,我想使用外部登录页面并让Alfresco读取cookie以记录用户(cookie将包含用户名和密钥,可用于验证他们是否已登录使用LDAP服务器。)

我查看了SDK附带的示例,但似乎没有办法在没有密码的情况下登录用户。

我正在查看外部身份验证子系统,并查看了CAS指南,但这看起来有点过分,我不确定我是否了解所发生的一切或为什么所有这些都需要我的情况。

在Exernal子系统中探索之后,我看到它使用了“SimpleAcceptOrRejectAllAuthenticationComponentImpl”,它覆盖了身份验证功能。在该函数中,它通过“setCurrentUser”函​​数对用户进行身份验证,但这依赖于“accept”的值被设置为true。我浏览了Alfresco源代码,查看了WEB-INF / classes / alfresco / subsystems / Authentication / external下的文件,但是我无法找到如何调用setAccept函数。经过一些谷歌搜索后,我找到了this example

看起来他们设置了一个过滤器,通过SimpleAcceptOrRejectAllAuthenticationComponentImpl对象记录用户,他们显式调用setAccept(true)。我还没有尝试过,但是他们的wiki说web.xml文件需要编辑,Alfresco Dev在另一篇文章中说过Alfresco v3.2之后不需要的东西(我使用的是v3.4.3)。这是走下去的正确道路吗?

我听说过另一个想法是编写我自己的Authenticator子系统,但我没有看到任何文档,并且不知道如何为外部子系统调用“setAccept”函数,我觉得我d在黑暗中拍摄。

关于如何根据外部webapp创建的cookie登录用户的想法(在同一个域上 - 我已经能够读取cookie,我只是不知道如何验证用户没有密码)?

1 个答案:

答案 0 :(得分:4)

我想我会为遇到同样问题的人发布解决方案。

步骤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并尝试一下。希望这会让你走上正轨。