我不是真正的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)
通过实施,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
将在每次调用doFilter时查找名称为“ springSecurityFilterChain”的bean并委托给它。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句