복붙노트

[SPRING] Spring Security 애플리케이션을 프록시 뒤에서 실행하는 방법은 무엇입니까?

SPRING

Spring Security 애플리케이션을 프록시 뒤에서 실행하는 방법은 무엇입니까?

Spring Security 3.0.5를 사용하는 Spring 3.0.3과 Java 1.6의 응용 프로그램 빌드를 가지고 있으며 RestEasy 2.1.0이 포함 된 Spring Web을 사용하여 REST API를 구현합니다. 이 애플리케이션 (서버)을 REST API 클라이언트 애플리케이션에서 HTTP 트래픽으로 변환하는 HTTPS 요청 트래픽을 변환하는 프록시 뒤에 배치해야한다. 이 변경으로 로그인 요청에 대한 "교차 도메인"시나리오가 생성됩니다. 클라이언트는 HTTPS 요청을 보내고 HTTP 응답은 서버 리디렉션 URL로 보냅니다. 현재 그것으로 응답 :

"http://192.168.0.10:8090/index.html;jsessionid=64FD79...86D",

내가 여기에 필요한 것은 :

"/index.html;jsessionid=64FD79...86D"

우리는 서버가 "절대"URL 대신 "상대적"URL로 응답하도록 솔루션을 제공했습니다. 그래서 여기에 설명 된 상황과 비슷한 것을 구현하려고했습니다.

forum.spring.io의 스레드

contextRelative = "true"로 RedirectStrategy bean을 설정하고 LoginSuccessHandler 확장 클래스 내에서 AbstractAuthenticationTargetUrlRequestHandler에서 redirectStrategy setter를 재정의하면 HttpServletResponse 객체에 대한 redirectStrategy 속성이 예상대로 true로 설정됩니다. 여전히 문제를 해결하지 못합니다.

또한 encodeRedirectURL ( "otherLogin")을 사용하여 HttpServletResponse 객체의 redirectURLCC 속성을 변경할 때 다음과 같이 설정됩니다.

"http://192.168.0.10:8090/otherLogin"

그리고 내가 필요로하는 것이 아닙니다. URL의 전체 프로토콜 + ipaddress 부분을 제거해야합니다. Filter 및 FilterChain 인터페이스 구현으로 래핑되므로 응답 객체의 URL 속성에 액세스 할 수 없습니다.

아이디어를 제안하십시오. 이런 종류의 일은 코드가 아닌 web.xml 또는 auth-AplicationContext.xml 파일에서 해결되어야한다고 생각합니다.

친애하는.

해결법

  1. ==============================

    1.스프링 시큐리티는 리다이렉트를 보낼 때 다음의 로직을 사용한다 :

    스프링 시큐리티는 리다이렉트를 보낼 때 다음의 로직을 사용한다 :

    public void sendRedirect(HttpServletRequest request, HttpServletResponse response, String url) throws IOException {
        String redirectUrl = calculateRedirectUrl(request.getContextPath(), url);
        redirectUrl = response.encodeRedirectURL(redirectUrl);
    
        if (logger.isDebugEnabled()) {
            logger.debug("Redirecting to '" + redirectUrl + "'");
        }
    
        response.sendRedirect(redirectUrl);
    }
    

    sendRedirect 메소드는 다음과 같은 방식으로 작동해야합니다.

    즉, 구성이나 컨텍스트 설정이 무엇이든간에 기본적으로 항상 절대 URL을 얻게됩니다.

    여러 옵션이 있습니다.

  2. ==============================

    2.전적으로 상대 경로는 아니지만, org.springframework.web.servlet.view.UrlBasedViewResolver를 사용하여이 답변에 설명 된대로 외부 호스트 이름으로 리디렉션 된 URL을 다시 쓰는 네 번째 옵션을 살펴볼 수 있습니다. 기본 리디렉션 URL 재정의 SpringMVC 애플리케이션에서.

    전적으로 상대 경로는 아니지만, org.springframework.web.servlet.view.UrlBasedViewResolver를 사용하여이 답변에 설명 된대로 외부 호스트 이름으로 리디렉션 된 URL을 다시 쓰는 네 번째 옵션을 살펴볼 수 있습니다. 기본 리디렉션 URL 재정의 SpringMVC 애플리케이션에서.

  3. ==============================

    3.Apache에서 다음과 같이 달성 할 수 있어야합니다.

    Apache에서 다음과 같이 달성 할 수 있어야합니다.

    ProxyPreserveHost Off
    ProxyPass / http://192.168.0.10:8090
    ProxyPassReverse / http://192.168.0.10:8090
    

    포트를 사용하여 프록 싱중인 호스트에서 역방향 프록시를 하나 더 추가합니다. 예를 들어 서버 이름이 proxy.example.com이라고 가정하면 네 번째 줄은 다음과 같습니다.

    ProxyPassReverse / http://proxy.exemple.com:8090
    

    이 답변을보십시오 : Apache 2 프록시 (mod_proxy) 뒤에있는 Tomcat 웹 응용 프로그램에서 리디렉션 보내기

  4. from https://stackoverflow.com/questions/26526830/how-to-make-spring-security-application-to-run-behind-a-proxy by cc-by-sa and MIT license