2011-09-22 2 views
1

Alfresco를 현재 로그인 시스템 (LDAP 서버)과 통합하려고합니다. LDAP 인증을 성공적으로 통합 할 수 있지만 외부 로그인 페이지를 사용하고 Alfresco가 사용자 로그인을위한 쿠키를 읽도록하고 싶습니다 (쿠키에 사용자 이름과 로그인 한 사용자를 확인할 수있는 키가 포함됩니다). LDAP 서버와 함께).쿠키가있는 Alfresco SSO

SDK와 함께 제공되는 예제를 살펴 보았지만 암호없이 사용자를 로그인하는 방법은없는 것처럼 보입니다.

외부 인증 서브 시스템을 조사하고 CAS 가이드를 보았지만 과도한 것처럼 보였습니다. 현재 진행중인 모든 작업이나 그 상황이 필요한 이유를 모두 알지 못합니다.

Exernal 하위 시스템에서 파싱 한 후 인증 기능을 무시하는 "SimpleAcceptOrRejectAllAuthenticationComponentImpl"을 사용합니다. 이 함수는 "setCurrentUser"함수를 통해 사용자를 인증하지만 true로 설정된 "accept"값에 의존합니다. Alfresco 소스를 살펴보고 WEB-INF/classes/alfresco/subsystems/Authentication/external 아래의 파일을 살펴 보았지만 setAccept 함수가 어떻게 호출되었는지 알 수 없습니다. 어떤 검색 후 나는 this example을 발견했다.

그들은 setAccept (true)를 명시 적으로 호출하는 SimpleAcceptOrRejectAllAuthenticationComponentImpl 객체를 통해 사용자를 기록하는 필터를 설정 한 것처럼 보입니다. 아직 시도하지는 않았지만 위키에 따르면 web.xml 파일을 편집해야한다고 Alfresco Dev가 Alfresco v3.2 (다른 버전에서는 v3.4.3 사용) 이후에 다른 게시물에서 필요하다고 말한 내용이 있습니다. 이것이 올바른 길인가?

내 자신의 Authenticator 하위 시스템을 작성하는 다른 아이디어를 들었지만 다른 하위 시스템에 대한 "setAccept"함수가 호출되는 방식을 모른 채 문서가 표시되지 않습니다. 어둠 속에서 총을 쏜다.

외부 웹 응용 프로그램 (동일한 도메인에있는 쿠키를 기반으로 쿠키에 기반하여 로그인하는 방법에 대한 의견 - 쿠키를 읽을 수 있었지만 인증 방법을 모르겠습니다. 암호없이 사용자)?

답변

4

같은 문제가있는 사람이라면 누구나 솔루션을 게시 할 것으로 생각했습니다.

1 단계 : 누군가가 내 URL 중 하나를 공격하려고 할 때 실행되는 필터를 만듭니다. 필터가 생성되면 jar 파일로 컴파일하고 패키지 한 다음 alfresco.war 및 share.war ("WEB-INF/lib"위치)에 해당 jar 파일을 넣습니다.

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 파일을 구성 (광산는/usr/share/바람둥이/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

안녕하세요, 여기에 언급 된 단계를 수행했지만 localhost : 8080 \ share를 열려고 시도 할 때 암호를 묻는 중입니다. 다른 변경을해야합니까?제발 제안 해주세요. – Sam

+0

하나의 외부 웹 응용 프로그램이 있습니다. 사용자는 외부 웹 응용 프로그램의 LDAP 서버를 통해 인증됩니다. LDAP 동기화 Alfresco와 잘 해냈습니다. 이제 외부 웹 응용 프로그램에 대한 인증이 성공하면 사용자를 공유 응용 프로그램 (response.sendRedirect (http : // localhost : 8080/share/page))으로 리디렉션하고 싶습니다. 그러나 로그인 페이지가 나타납니다. 현재 "admin "당신이 코드에서 언급 한 필터에서. 친절하게 어떻게 이것을 달성하는 데 도움이. – Sam

+0

내가이 게시물을 쓴 이후로 꽤 오래되었다. 내 필터가 크게 성장했다. - 핵심은 위에있다. proprieterayUserIdValidationAndExtractionMethod 메소드가 HttpServletRequest와 HttpServletResponse 객체들 HttpServletRequest 객체로부터 쿠키를 읽고 그 위에 세션을 저장했습니다. 검증을 확인하기 위해, 나는 우리의 인증 서비스가 제공 한 REST 호출에 쿠키 값을 전달했습니다.이 REST 호출은 사용자에게 유효한지 필터에 알려주었습니다. 따라서 인증 서비스에서 쿠키를 설정하거나 데이터를 공유로 전달하여 사용자의 신원을 확인하는 것이 좋습니다. – patorjk