为什么Spring Security在Tomcat中可以工作,而在部署到Weblogic时却不能工作? - java

我并不是真正的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中存在一个与添加过滤器实例有关的错误。从上面的JIRA:

Oracle承认它是一个错误:17382048,已通过补丁16769849修复。
据报道它在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)

可以通过实现WebApplicationInitializer向上述机制注册Spring Security。例如,您可以创建以下类:

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时将其委托给它。

Spring MVC中的输入验证 - java

我知道Commons Validator框架是Struts项目在服务器端和客户端验证输入值的事实上的标准。Spring MVC项目是否也是如此?我得到的印象可能不是,大多数Struts书籍和论坛都谈论Commons Validator框架,但是只有少数Spring书籍和论坛可以。在Spring MVC项目中验证输入的最佳实践是什么?干杯! 参考方案 在引入S…

Java:“自动装配”继承与依赖注入 - java

Improve this question 我通常以常见的简单形式使用Spring框架: 控制器服务存储库通常,我会在CommonService类中放一个通用服务,并使所有其他服务扩展到类中。一个开发人员告诉我,最好在每个服务中插入CommonClass而不是使用继承。我的问题是,有一个方法比另一个更好吗? JVM或性能是否会受到另一个影响?更新资料Comm…

Spring中的应用程序上下文有什么作用? - java

我昨天问了一个问题(Using Spring in standalone apps),有关如何在独立应用程序中使用Spring。由此得知,您只创建一次应用程序上下文对象。因此,现在的问题是(即使在评论中得到了部分回答)创建应用程序上下文时会发生什么?当您说时,Spring是否会创建这些豆子并将它们连接在一起new ClassPathXmlApplicatio…

注解中的Spring属性值 - java

如何获取注释内的属性值。例如我有一个注释@GetMyValue(value1="Val1",intVal=10) 现在,我希望“ Val1”和10来自属性文件。我试过了@GetMyValue(value1="${test.value}",intVal="${test.int.value}") 这不起…

Spring Data Cassandra的事务管理 - java

我正在使用Spring和Cassandra作为基础数据库。曾提到过弹簧伞项目“ spring data cassandra”。与休眠不同,在这里无法找到如何管理事务。如果您中的某些人已经合并,请共享要包含的事务管理器的详细信息。 参考方案 Cassandra不支持传统(ACID)的事务。在某些特殊情况下,可以通过一些构造来实现事务原子性,例如原子批处理(请参…