Alfresco SSO с Cookie - PullRequest
       16

Alfresco SSO с Cookie

1 голос
/ 22 сентября 2011

Я хочу интегрировать Alfresco с моей текущей системой входа в систему (которая является сервером LDAP). Я могу успешно интегрировать аутентификацию LDAP в, однако, я хочу использовать внешнюю страницу входа в систему и сделать так, чтобы Alfresco прочитал куки-файл для входа в систему пользователя (куки-файл будет содержать имя пользователя и ключ, который можно использовать для проверки входа в систему). с сервером LDAP).

Я посмотрел пример, который шел с SDK, но, похоже, нет способа войти в систему без пароля.

Я заглянул в подсистему внешней аутентификации и увидел руководство по CAS, но это кажется излишним, и я не уверен, что понимаю все, что происходит, или почему все это необходимо для моей ситуации.

После поиска в подсистеме Exernal я увидел, что она использует "SimpleAcceptOrRejectAllAuthenticationComponentImpl", который переопределяет функцию аутентификации. В этой функции он аутентифицирует пользователя с помощью функции "setCurrentUser", но это зависит от значения "accept", установленного в true Я пролистал источник Alfresco и просмотрел файлы в WEB-INF / classes / alfresco / subsystems / Authentication / external, но не смог выяснить, как когда-либо вызывалась функция setAccept. После некоторого поиска в Google я нашел этот пример .

Похоже, что они настроили фильтр, который регистрирует пользователя через объект SimpleAcceptOrRejectAllAuthenticationComponentImpl, где они явно вызывают setAccept (true). Я еще не пробовал этого, но в их вики сказано, что файл web.xml нужно отредактировать, а то, что сказал Alfresco Dev в другом посте, не понадобилось после Alfresco v3.2 (я использую v3.4.3). Это правильный путь, чтобы идти вниз?

Я слышал, что другой идеей было бы написать собственную подсистему Authenticator, но я не вижу никаких документов по этому вопросу, и, не зная, как вызывается функция setAccept для внешней подсистемы, я чувствую, что буду стрелять в темноте.

Любые мысли о том, как войти в систему пользователя на основе файла cookie, созданного внешним веб-приложением (которое находится в том же домене - я смог прочитать файл cookie, я просто не знаю, как аутентифицировать пользователя без пароля)?

1 Ответ

4 голосов
/ 09 марта 2012

Я решил опубликовать решение для всех, у кого была такая же проблема.

Шаг 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. Настройте файл web.xml для tomcat, чтобы он распознал этот фильтр (мой файл находился в /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 и попробуйте. Надеюсь, это поможет вам выбрать правильный путь.

...