4

Tomcat 7에서 실행되는 자바 웹 애플리케이션이 있습니다. 백엔드에서 스프링 3.2와 함께 스프링 3.2를 사용하고 있습니다./api/** 패턴 다음에 RESTful URL을 통해 API를 노출합니다.스프링 보안 3.1을 사용하여 폼 - 로그인과 http- 기본 보안을 모두 사용하여 동일한 RESTful 리소스를 보호합니다.

웹 응용 프로그램의 UI는 BackboneJS를 사용하여 작성됩니다. RESTful URL에 직접 매핑 된 백본 모델을 사용하고 있습니다.

UI는 양식 로그인 인증을 사용하여 잠겨 있으므로 사용자가 현재 인증되지 않은 경우 항상 로그인 화면으로 리디렉션됩니다.

이제 http-basic 인증을 사용하여 다른 RESTful URL을 다른 외부 서비스에 노출하려고 시도하고 있습니다. 불행히도, 동일한 URL 패턴을 확보 할 때 스프링은 하나 이상의 필터 체인을 사용할 수없는 것 같습니다. 구성 파일에서 먼저 정의 된 것이 우선합니다.

동일한 RESTful 리소스에 대해 별도의 URL 패턴에 매핑해야한다는 것은 싫지만 선택의 여지가없는 것처럼 보입니다. 가능 (보안의 두 가지 유형을 구성하는 것입니다 HTTP :

<!-- configure basic http authentication --> 
<http pattern="/api/**" create-session="stateless"> 
    <intercept-url pattern="/**" access="ROLE_USER"/> 
    <http-basic/> 
</http> 

<!-- configure form-login authentication --> 
<http auto-config="true" use-expressions="true"> 
    <intercept-url pattern="/ui/login" access="permitAll" /> 
    <intercept-url pattern="/ui/logout" access="permitAll" /> 
    <intercept-url pattern="/ui/loginfailed" access="permitAll" /> 
    <intercept-url pattern="/**" access="ROLE_USER" /> 
    <custom-filter ref="ajaxTimeoutRedirectFilter" after="EXCEPTION_TRANSLATION_FILTER" /> 
    <form-login login-page="/ui/login" default-target-url="/" authentication-failure-url="/ui/loginfailed" /> 
    <logout logout-success-url="/ui/logout" /> 
    <session-management invalid-session-url="/ui/login"/> 
</http> 

내 질문은 : 여기

내 (현재 부서) 봄 보안 구성의 중요한 샘플입니다 -basic과 form-login)을 Spring Security를 ​​사용하여 동일한 URL 패턴에 적용 할 수 있습니까? 이 유형의 시나리오에 대한 모범 사례가 있습니까?

고맙습니다.

+0

인증되지 않은 사용자가 이러한 리소스 중 하나를 요청하려고 할 때 우선 적용 하시겠습니까? 양식 기반 인증을 사용하면 로그인 페이지로 302 리디렉션을 얻습니다. 기본 인증은 401 인증을 얻습니다. 기본 인증 클라이언트가 도전 받기를 기다리지 않고 선제 적으로 인증 헤더를 포함해야한다고 주장하지 않는 한 동일한 URL에서 둘 모두를 올바르게 지원할 수있는 방법을 모르겠습니다. –

+0

@IanRoberts 이것은 동일한 URL을 보호 할 때 주요 문제인 것으로 보입니다.이상적으로 보안 서비스가 들어오는 요청 헤더를 기반으로 하나 또는 둘 다 선택할 수있을만큼 똑똑하기를 바란다. 지금은 UI 대 외부 서비스에서 발생한 요청에 별도의 URL을 사용하는 방향으로 기울어 져있다. 그것은 가장 간단한 접근법처럼 보입니다. –

답변

1

왜 당신은 다음과 같은 두 <http> 요소를 병합하지 않는다 : 이것은 모두 UsernamePasswordAuthenticationFilter 및 사용자 인터페이스 클라이언트를 제공 할 수있는 동일한 필터 체인의 BasicAuthenticationFilter, 외부를 설정합니다

<http pattern="/api/**" use-expressions="true"> 
    <intercept-url pattern="/ui/login" access="permitAll" /> 
    <intercept-url pattern="/ui/logout" access="permitAll" /> 
    <intercept-url pattern="/ui/loginfailed" access="permitAll" /> 
    <intercept-url pattern="/**" access="ROLE_USER" /> 
    <http-basic/> 
    <custom-filter ref="ajaxTimeoutRedirectFilter" after="EXCEPTION_TRANSLATION_FILTER" /> 
    <form-login login-page="/ui/login" default-target-url="/" authentication-failure-url="/ui/loginfailed" /> 
    <logout logout-success-url="/ui/logout" /> 
    <session-management invalid-session-url="/ui/login"/> 
</http> 

서비스도 제공합니다.

<http pattern="/api/**" create-session="stateless"> 
    <intercept-url pattern="/api/**" access="ROLE_USER"/> 
    <http-basic/> 
</http> 
0

봅니다 API의 설정에서 = "/ API/는"패턴 패턴 = "/ "를 대체하는 .

하지만 앞으로 완전히 다른 필터 체인을 적용해야하므로 UI ​​및 API로 고유 한 URL 패턴을 사용하는 것이 좋습니다.

예를 들어 SecurityContextRepository는 세션 정보를 보유하고 각 요청에 대해 검색됩니다. 기본 인증을 통해 UI 및 API 액세스에 동일하게 적용하고 싶지 않음

+0

불행히도 이것은 여전히 ​​위의 설명에서 Ian이 언급 한 것과 동일한 문제를 야기합니다. 사용자가 인증되지 않은 경우 어떤 상태 코드가 반환됩니까? http 기본의 경우 폼 로그인을위한 로그인 페이지로 리디렉션되는 대신 401을 얻습니다. –

1

가능하지 상자 밖으로 단일 URL의 패턴이 다른 필터 체인을 적용 :