2011-02-01 3 views
2

나는 EJB 모듈과 웹 애플리케이션 모듈 (서블릿)을 가진 엔터프라이즈 애플리케이션을 가지고있다. URLConnection을 사용하여 EJB에서 서블릿 URL에 액세스하지만 보안을 위해 URL을 보호하려고합니다. 단일 사인 온 솔루션을 사용할 수 없기 때문에 사용자 이름과 암호를 사용하여 인증하지 않으므로 엔터프라이즈 응용 프로그램에서만 액세스 할 수있는 URL을 제한하는 방법이 필요합니다. 도와주세요.username 패스워드 인증을 사용하지 않고 서블릿 URL을 보호하기

+0

일반 클래스를 다른 항아리로 리팩토링하려고 시도했지만 다른 클래스에 너무 많은 종속성이있는 것 같습니다. 그래도 여전히 실패하고 있으며 아직 조사 중입니다. 그러나 전체 jar 파일을 WEB-INF/lib에서 APP-INF/lib로 이동하여 EJB 및 webapp 모듈 모두에서 이러한 클래스에 액세스 할 수 있도록하는 것이 좋습니다. 클래스 로더와 관련된 문제가 있거나 컨테이너에 의한 서블릿 초기화와 관련된 문제가 있습니까? – krish

+0

위의 의견에 대한 나의 질문을 별도의 질문으로해야하는지 알려주십시오. – krish

답변

1

같은 시스템에서 실행되는 경우 정상적인 방법은 서블릿이 수행하는 비즈니스 작업을 다른 Java 클래스로 리팩토링하는 것이며, EJB와 서블릿 모두에서 가져 오거나 사용할 수 있습니다.

+0

이런 종류의 시나리오에서 코드를 리팩터링하는 것이 좋지만 제 경우에는 서블릿이 수행하는 작업을 서블릿의 컨텍스트에서 수행해야합니다. – krish

+0

정확히 서블릿 컨텍스트가 필요합니까? – BalusC

+0

코드는 서블릿 컨텍스트를 사용하여 응용 프로그램 이름을 가져 와서 다른 곳으로 업데이트했지만 해당 종속성을 제거하는 방법이었습니다. 다른 자바 클래스로 코드를 리팩토링하는 것에 대한 조언처럼 보이고 두 EJB 서블릿 모두에서이를 사용하는 것이 더 의미가 있으므로이 솔루션을 연구하고 있습니다. 감사. – krish

1

당신은 (예를 BASIC 인증에 사용) 당신이 당신의 서블릿 응용 프로그램을 배포하고 해당 사용자를 사용하여 응용 프로그램을 보호하기 위해 사용하는 응용 프로그램 서버에서 사용자 자격 증명을 만들 수 있습니다

<security-constraint> 
    <web-resource-collection> 
    <web-resource-name> 
     Entire Application 
    </web-resource-name> 
    <url-pattern>/*</url-pattern> 
    </web-resource-collection> 
    <auth-constraint> 
     <role-name>member</role-name> 
    </auth-constraint> 
</security-constraint> 

당신은 다음 EJB에서 인증을 사용할 수 있습니다 .

+0

답변 해 주셔서 감사합니다. URL을 보호하고 EJB에서 인증하기 위해 Application Server에서 사용자를 생성하면 피하려는 EJB에서 사용자 이름과 암호를 하드 코딩해야합니다. – krish

3

많은 정보는 당신이 남겨 두었다된다

  • 이 EJB 모듈에 의해서만 사용되는 서블릿, 아니면 그것은 또한 다른 클라이언트에 의해 사용된다?
  • 서블릿과 EJB 모듈이 동일한 컨테이너에서 실행 중입니까? 같은 물리적 기계?
  • 어떤 웹 서버/서블릿 컨테이너/J2EE 컨테이너를 사용하고 있습니까?

서블릿은 EJB 모듈에서만 사용, 그들은 동일한 시스템에 모두 경우, 당신은 단지 localhost에서 연결을 허용하는 웹 컨테이너를 구성하고 EJB 모듈을 가리키는 데 사용하는 URL을 변경할 수 있습니다 공개 도메인 이름 또는 IP 주소 대신 localhost에 있습니다.

다른 시스템에 있거나 서블릿이 다른 클라이언트에 의해 사용되는 경우, EJB 모듈을 어떻게 든 인증해야합니다. SSL 클라이언트 인증서 (this question 참조)를 사용하거나 EJB 모듈의 IP 주소로부터의 연결을 허용하도록 서블릿 컨테이너를 구성 할 수 있습니다. 액세스를 제어하는 ​​서블릿 필터 사용이

EDIT

상당히 간단하다. 귀하의 경우 요청이 로컬 호스트에서오고 있는지 확인하고자합니다. 그렇지 않은 경우 승인되지 않은 메시지를 클라이언트에 다시 보냅니다. 여기

는 그렇게해야하는 매우 간단한 doFilter 방법의 구현 :

public void doFilter(ServletRequest request, 
        ServletResponse response, 
        FilterChain chain) 
    throws ServletException, IOException 
{ 
    if (!request.getRemoteAddr().equals("127.0.0.1")) { 
     HttpServletResponse rsp = (HttpServletResponse) response; 
     rsp.sendError(HttpServletResponse.SC_FORBIDDEN, "You are not authorized to access this resource."); 
    } 

    chain.doFilter(request, response); 
} 

가 같은 것을 사용하여 web.xml에 필터를 추가 다음

<filter> 
    <filter-name>AuthorizationFilter</filter-name> 
    <filter-class>com.foo.bar.AuthorizationFilter</filter-class> 
</filter> 

<filter-mapping> 
    <filter-name>AuthorizationFilter</filter-name> 
    <servlet-name>RestrictedServlet</servlet-name> 
</filter-mapping> 

필터가 순서대로 실행됩니다 그들이 web.xml에 나타나므로 인증 필터가 나열된 첫 번째 필터인지 확인하십시오.

이 모든 것을 말하면서, 저는 여기 BalusC와 동의합니다. 가능한 경우 EJB 모듈이 서블릿 호출을 작성하는 대신 직접 코드를 실행하도록 코드를 리팩터링해야합니다.

+0

1. 문제의이 서블릿은 EJB에 의해 사용되지만 동일한 웹 애플리케이션의 다른 서블릿은 다른 클라이언트에 의해 사용됩니다. 2. 서블릿과 EJB가 동일한 컨테이너에서 실행되는 동일한 애플리케이션에 있음 3.이 애플리케이션은 웹 논리 서버 웹 응용 프로그램에는 (원격 컴퓨터에서) 다른 클라이언트가 액세스하는 다른 서블릿도 있습니다. 따라서 WLS는 프티 귤러 서블릿의 로컬 호스트에서만 연결을 허용하도록 구성 할 수 있습니까? 그렇다면 WLS에서 어떻게 구성합니까? – krish

+0

서블릿별로 호스트 기반 액세스를 수행하도록 WLS를 구성 할 수 있는지 여부를 알지 못합니다. localhost에서만 수신 대기하도록 컨테이너를 구성 할 수 있지만 이는 컨테이너의 모든 서블릿과 웹 애플리케이션에 영향을 미칩니다. 서블릿 필터를 사용하여 단일 서블릿에 대한 액세스를 제어 할 수 있습니다. –

+0

서블릿에 대한 액세스를 제어하는 ​​서블릿 필터 (모든 샘플은 큰 도움이 될 것입니다)를 사용하는 방법을 알려주십시오. 이전에 필터를 살펴 봤지만 액세스를 제어 할 수있는 방법을 찾지 못했습니다. – krish

관련 문제