복붙노트

[SPRING] Spring Security와 동일한 어플리케이션에서 두 영역?

SPRING

Spring Security와 동일한 어플리케이션에서 두 영역?

우리는 인증 된 사용자와 익명 사용자가 사용할 수있는 웹 응용 프로그램을 만들고 있습니다. 등록 / 로그인하지 않기로 결정하면 제한된 기능 만 사용할 수 있습니다. 사용자 인증은 Spring Security가있는 OpenID를 통해 수행됩니다. 그건 잘 작동합니다.

그러나 응용 프로그램에는 / / admin에 배포 된 관리자 UI도 함께 제공됩니다. 스프링 보안과 두 개의 분리 된 영역을 가질 수 있습니까 (예 : / admin / **에 대한 기본 인증)? 어떻게 구성해야합니까?

해결법

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

    1.스프링 시큐리티는 현재 릴리스 후보로 제공되고있는 버전 3.1에서이 시나리오에 대한 지원을 추가했습니다. SEC-1171에 의해 구현되었으며 구문에 대한 자세한 내용은 3.1에 포함 된 설명서에 나와 있습니다.

    스프링 시큐리티는 현재 릴리스 후보로 제공되고있는 버전 3.1에서이 시나리오에 대한 지원을 추가했습니다. SEC-1171에 의해 구현되었으며 구문에 대한 자세한 내용은 3.1에 포함 된 설명서에 나와 있습니다.

    그러나 사용하기가 아주 쉽습니다. 기본적으로 스프링 보안 설정에서 각 영역마다 하나씩 여러 개의 http 요소를 정의합니다. 우리는 이것을 다음과 같이 사용합니다 :

    <!-- Configure realm for system administration users -->
    <security:http pattern="/admin/**" create-session="stateless">
        <security:intercept-url pattern='/**' access='ROLE_ADMIN' requires-channel="https" />
        <security:http-basic/>  
    </security:http>
    
    
    <!-- Configure realm for standard users -->
    <security:http auto-config="true" access-denied-page="/error/noaccess" use-expressions="true" create-session="ifRequired">
        <security:form-login login-page="/login"
                ...
                ...
    </security:http>
    

    주목할 핵심 사항은 첫 번째 http 요소에서 pattern = "/ admin / **"입니다. 이것은 / admin 아래의 모든 URL이 기본 영역 대신 그 영역에 종속된다는 것을 Spring에 알립니다. 따라서 / admin 아래의 URL은 기본 인증을 대신 사용합니다.

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

    2.가능한 해결책:

    가능한 해결책:

    샘플 구성 :

    <security:intercept-url pattern="/admin" access="ROLE_ADMIN"/>
    
    <bean id="basicAuthenticationEntryPoint" 
          class="org.springframework.security.web.authentication.www.BasicAuthenticationEntryPoint">
        <property name="realmName" 
                  value="WS realm"/>
    </bean>
    
    <bean id="basicAuthenticationProcessingFilter"
          class="org.springframework.security.web.authentication.www.BasicAuthenticationFilter">
        <property name="authenticationManager" 
                  ref="authenticationManager"/>
        <property name="authenticationEntryPoint" 
                  ref="basicAuthenticationEntryPoint"/>    
    </bean>
    

    참고 : BasicAuthenticationFilter의 기본 구현은 수동 필터입니다. 즉, 요청에서 기본 인증 헤더를 찾고,없는 경우 아무것도 수행하지 않습니다. 필터가 명시 적으로 클라이언트의 기본 인증을 요구하도록하려면 인증 진입 점으로 시작하도록 기본 구현을 확장해야합니다.

    public class BasicAuthenticationFilter 
           extends org.springframework.security.web.authentication.www.BasicAuthenticationFilter {
    
        public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
    
            final HttpServletRequest request = (HttpServletRequest) req;
            final HttpServletResponse response = (HttpServletResponse) res;
    
            String header = request.getHeader("Authorization");
    
            if ((header != null) && header.startsWith("Basic ")) {
                super.doFilter(req, res, chain);
            } else {
                getAuthenticationEntryPoint().commence(request, response, new AuthenticationCredentialsNotFoundException("Missing credentials"));
            }
        }
    }
    

    또한 doFilter 메서드에서 하드 코딩하거나 적절한 래퍼 빈을 제공하여 / admin URL에만 적용되도록 필터를 조정해야합니다.

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

    3.나는 두 가지 영역을 갖는 직선적 인 방법을 생각할 수 없다. (그리고 나는 그것을 직접 시도하지 않았다.)

    나는 두 가지 영역을 갖는 직선적 인 방법을 생각할 수 없다. (그리고 나는 그것을 직접 시도하지 않았다.)

    web.xml에 두 개의 필터를 정의 할 수 있습니다. 각각의 필터는 서로 다른 스프링 구성을 가지고 있으며 자체 환경을 가지고 있습니다. 글로벌 일들은 필터 설정에서 영역 고유의 app config로 들어갑니다.

    다른 인증 방법의 경우에만 필터를 작성하여 호출 할 필터를 결정할 수 있습니다.

  4. from https://stackoverflow.com/questions/3671861/two-realms-in-same-application-with-spring-security by cc-by-sa and MIT license