java - 为什么 Spring Security 在 Tomcat 中工作,但在部署到 Weblogic 时却没有?

标签 java spring spring-security spring-boot weblogic12c

我并不是真正的 Java 开发人员,但一个客户项目要求我这样做,所以也许我遗漏了一些非常明显的东西。

我正在使用 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
    }

}

提前致谢。

最佳答案

听起来你好像遇到了SEC-2465 .简而言之,WebLogic 中存在与添加 Filter 实例相关的 bug。从上面的JIRA:

Oracle acknowledged it as a bug: 17382048, fixed with patch 16769849. It is reported as being fixed in WLS 12.1.3



客户端应更新其 WebLogic 服务器以获得修复。或者,您可以创建自己的 AbstractSecurityWebApplicationInitializer 版本。使用类方法注册 springSecurityFilterChain :
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 时委托(delegate)给它。

关于java - 为什么 Spring Security 在 Tomcat 中工作,但在部署到 Weblogic 时却没有?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29392595/

相关文章:

java - 使用 Java Pattern API 对 EdiText 进行过滤条件

java - 当类扩展另一个类时如何使用枚举强制单例模式

Java循环引用,糟糕的风格?

用于 AND、OR 和 NOT 的 Spring AOP 切入点语法

java - 将表 wp_users(Wordpress) 转换为表 users(Java) - 安全登录

java - 任何人都可以解释这个 HashMap 行为吗

java - 是否可以在 jSTL 中使用 foreach 同时迭代两个项目?

java - Spring MVC - 文件上传 - etat HTTP 500 错误消息

java - Spring Security JWT 验证不使用 UsernamePasswordAuthenticationToken

java - tomcat7 在 ubuntu 中用 spring 循环请求。怎么修?