복붙노트

[SPRING] Spring Security가 Tomcat에서 작동하지만 Weblogic에 배포되지 않는 이유는 무엇입니까?

SPRING

Spring Security가 Tomcat에서 작동하지만 Weblogic에 배포되지 않는 이유는 무엇입니까?

나는 정말로 자바 개발자는 아니지만 클라이언트를위한 프로젝트는 내가 있어야한다고 요구했기 때문에 아마도 눈에 띄게 분명한 것을 놓치고있을 수 있습니다.

SpringBoot를 사용하고 있으며 응용 프로그램이 로컬 컴퓨터와 테스트 서버에서 Tomcat으로 실행될 때 모든 것이 잘 작동합니다. 그러나 애플리케이션이 Weblogic에 배포되는 즉시 액세스 할 수있는 모든 경로가있는 보안이 전혀없는 것처럼 보입니다. 로그인 및 로그 아웃 경로도 존재하지 않습니다.

그렇게 말하고있다. 그 밖의 모든 기능은 아무런 보안 기능 없이도 정상적으로 작동합니다.

Weblogic에 액세스 할 수있는 것은 클라이언트가 코드를 배포하는 것이므로 12c에서 실행 중임을 말한 것입니다. 이 문제를 해결하거나 문제를 해결하려면 어떻게해야합니까?

내 Application.java의 관련 구성은 다음과 같습니다.

/**
 * The type Authentication security.
 */
@Order(Ordered.HIGHEST_PRECEDENCE)
@Configuration
protected static class AuthenticationSecurity extends GlobalAuthenticationConfigurerAdapter {

    /**
     * The Users.
     */
    @Autowired
    private Users users;

    /**
     * Init void.
     *
     * @param auth the auth
     * @throws Exception the exception
     */
    @Override
    public void init(AuthenticationManagerBuilder auth) throws Exception {
        auth.userDetailsService(users).passwordEncoder(new BCryptPasswordEncoder());
    }
}

/**
 * The type Application security.
 */
@Order(SecurityProperties.ACCESS_OVERRIDE_ORDER)
protected static class ApplicationSecurity extends WebSecurityConfigurerAdapter {

    /**
     * Configure void.
     *
     * @param http the http
     * @throws Exception the exception
     */
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        // @formatter:off
        http.authorizeRequests()
                .antMatchers("/vendor/*","/public/**/*","/partners/*","/events/*", "/login").permitAll()
                .anyRequest().fullyAuthenticated().and().formLogin().loginPage("/login")
                .and().logout()
                .logoutRequestMatcher(new AntPathRequestMatcher("/logout")).and()
                .exceptionHandling().accessDeniedPage("/access?error");
        // @formatter:on
    }

}

미리 감사드립니다.

해결법

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

    1.SEC-2465를 실행하는 것처럼 들립니다. 즉, WebLogic에 Filter 인스턴스를 추가하는 것과 관련된 버그가 있습니다. 위의 JIRA에서 :

    SEC-2465를 실행하는 것처럼 들립니다. 즉, WebLogic에 Filter 인스턴스를 추가하는 것과 관련된 버그가 있습니다. 위의 JIRA에서 :

    클라이언트는 수정 사항을 얻기 위해 WebLogic 서버를 갱신해야합니다. 또는 springSecurityFilterChain을 클래스 메서드로 등록하는 AbstractSecurityWebApplicationInitializer의 고유 한 버전을 만들 수 있습니다.

    servletContext.addFilter(String filterName, java.lang.Class<? extends Filter> filterClass)
    

    그런 다음 AbstractSecurityWebApplicationInitializer의 하위 클래스는 사용자 정의 클래스를 확장합니다.

    최신 정보

    업데이트 된 정보를 바탕으로, 나는 여전히 문제가 위에서 언급 한 WebLogic 버그와 관련이 있다고 주장합니다. SpringBootServletInitializer를 사용할 때 필터는 FilterRegistrationBean을 클래스가 아닌 인스턴스로 추가됩니다.

    가장 쉬운 옵션은 모든 것이 그대로 작동해야하기 때문에 WebLogic로 업데이트하는 것입니다.

    이 문제를 해결하려면 Spring Security 및 기타 필터의 등록을 비활성화 할 수 있습니다. 다음과 같이 FilterRegistrationBean을 작성하면됩니다.

    @Bean
    public FilterRegistrationBean springSecurityFilterChainRegistrationBean(@Qualifier("springSecurityFilterChain") Filter filter) {
        FilterRegistrationBean bean = new FilterRegistrationBean();
        bean.setFilter(filter);
        bean.setEnabled(false);
        return bean;
    }
    

    그런 다음 필터가 다음을 사용하여 등록되었는지 확인해야합니다.

    servletContext.addFilter(String filterName, java.lang.Class<? extends Filter> filterClass)
    

    Spring Security는 WebApplicationInitializer를 구현함으로써 위 메커니즘으로 등록 될 수있다. 예를 들어 다음 클래스를 만들 수 있습니다.

    package demo;
    
    import java.util.EnumSet;
    
    import javax.servlet.FilterRegistration.Dynamic;
    import javax.servlet.*;
    
    import org.springframework.web.WebApplicationInitializer;
    import org.springframework.web.filter.DelegatingFilterProxy;
    
    public class SecurityInitializer implements WebApplicationInitializer {
    
        @Override
        public void onStartup(ServletContext context) throws ServletException {
            Dynamic registration =
                    context.addFilter("springSecurityFilterChain", DelegatingFilterProxy.class);
            EnumSet<DispatcherType> dispatcherTypes =
                    EnumSet.of(DispatcherType.REQUEST, DispatcherType.ERROR, DispatcherType.ASYNC);
            registration.addMappingForUrlPatterns(dispatcherTypes, true, "/*");
        }
    }
    

    DelegatingFilterProxy는 "springSecurityFilterChain"이라는 이름의 bean을 찾고 doFilter가 호출 될 때마다 위임합니다.

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

    2.난 당신이 필터 체인에 securityContextPersistenceFilter를 추가해야한다고 생각

    난 당신이 필터 체인에 securityContextPersistenceFilter를 추가해야한다고 생각

    <bean id="securityContextPersistenceFilter" class="org.springframework.security.web.context.SecurityContextPersistenceFilter" />
    

    SecurityContextPersistenceFilter 클래스에서 다음 주석을 발견했습니다.

     * This filter will only execute once per request, to resolve servlet container (specifically Weblogic)
     * incompatibilities.
    
  3. ==============================

    3.기록을 위해 그리고 아마도 조금 늦게, 나는 최근에 (다른 사람들 사이에서) 같은 문제에 부딪혔고 Spring MVC (4.1.1.RELEASE)를 사용하여 Spring Security (4.0.0.RELEASE)를 얻었다. 위에서 설명한대로 FilterRegistrationBean) Weblogic 12.1.3에서 작동합니다. Filterchain 추가에 대한 Rob Winch에게 감사드립니다 (보안없이 모든 URL에 액세스 할 수있는 문제를 해결했습니다). WebApplicationInitializer를 구현하고 onStart 메서드를 다음과 같이 재정의하면 트릭이 수행됩니다.

    기록을 위해 그리고 아마도 조금 늦게, 나는 최근에 (다른 사람들 사이에서) 같은 문제에 부딪혔고 Spring MVC (4.1.1.RELEASE)를 사용하여 Spring Security (4.0.0.RELEASE)를 얻었다. 위에서 설명한대로 FilterRegistrationBean) Weblogic 12.1.3에서 작동합니다. Filterchain 추가에 대한 Rob Winch에게 감사드립니다 (보안없이 모든 URL에 액세스 할 수있는 문제를 해결했습니다). WebApplicationInitializer를 구현하고 onStart 메서드를 다음과 같이 재정의하면 트릭이 수행됩니다.

        // Create the 'root' Spring application context
        AnnotationConfigWebApplicationContext rootContext = new AnnotationConfigWebApplicationContext();
        rootContext.register(SecurityConfiguration.class);
    
        // Manage the lifecycle of the root application context
        container.addListener(new ContextLoaderListener(rootContext));
    
        // Create the dispatcher servlet's Spring application context
        AnnotationConfigWebApplicationContext dispatcherServlet = new AnnotationConfigWebApplicationContext();
        dispatcherServlet.register(WebMvcConfiguration.class);
    
        // Register and map the dispatcher servlet
        ServletRegistration.Dynamic dispatcher = container.addServlet("dispatcher", new DispatcherServlet(dispatcherServlet));
        dispatcher.setLoadOnStartup(1);
        dispatcher.addMapping("/");
    
        // Register spring security FilterChain
        FilterRegistration.Dynamic registration = container.addFilter("springSecurityFilterChain", DelegatingFilterProxy.class);
        EnumSet<DispatcherType> dispatcherTypes = EnumSet.of(DispatcherType.REQUEST, DispatcherType.ERROR, DispatcherType.ASYNC);
        registration.addMappingForUrlPatterns(dispatcherTypes, true, "/*");
    
  4. ==============================

    4.완성을 위해 서블릿 사양 <3.0 (예 : 10.3.6, 2.5)을 사용하는 이전 버전의 Weblogic에 배포하는 경우 web.xml에서 springSecurityFilterChain을 정의해야합니다.

    완성을 위해 서블릿 사양 <3.0 (예 : 10.3.6, 2.5)을 사용하는 이전 버전의 Weblogic에 배포하는 경우 web.xml에서 springSecurityFilterChain을 정의해야합니다.

    <filter>
        <filter-name>springSecurityFilterChain</filter-name>
        <filter-class>
            org.springframework.web.filter.DelegatingFilterProxy
        </filter-class>
    </filter>
    <filter-mapping>
        <filter-name>springSecurityFilterChain</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
    
  5. from https://stackoverflow.com/questions/29392595/why-is-spring-security-working-in-tomcat-but-not-when-deployed-to-weblogic by cc-by-sa and MIT license