Jon*_*ter 6 java spring spring-security weblogic12c spring-boot
我并不是真正的 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
}
}
Run Code Online (Sandbox Code Playgroud)
提前致谢。
听起来好像您遇到了SEC-2465。简而言之,WebLogic 中存在与添加 Filter 实例相关的错误。从上面的 JIRA 中:
Oracle 承认这是一个错误:17382048,已通过补丁 16769849 修复。据报道,它已在 WLS 12.1.3 中修复
客户端应更新其 WebLogic 服务器以获取修复。或者,您可以创建自己的AbstractSecurityWebApplicationInitializer版本,使用类方法注册 springSecurityFilterChain:
servletContext.addFilter(String filterName, java.lang.Class<? extends Filter> filterClass)
Run Code Online (Sandbox Code Playgroud)
然后,您的 AbstractSecurityWebApplicationInitializer 子类将扩展您的自定义类。
更新
根据更新的信息,我仍然认为该问题与上述 WebLogic bug 有关。使用 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;
}
Run Code Online (Sandbox Code Playgroud)
然后您需要确保过滤器已使用注册
servletContext.addFilter(String filterName, java.lang.Class<? extends Filter> filterClass)
Run Code Online (Sandbox Code Playgroud)
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, "/*");
}
}
Run Code Online (Sandbox Code Playgroud)
DelegatingFilterProxy每次调用 doFilter 时都会查找名为“springSecurityFilterChain”的 bean 并委托给它。
| 归档时间: |
|
| 查看次数: |
9019 次 |
| 最近记录: |