I'm not really a Java developer, but a project for a client has required me to be, so maybe I'm missing something glaringly obvious.
I'm using SpringBoot and everything works fine when the application runs in Tomcat on my local machine and on our testing server. However, as soon as the application is deployed to Weblogic it's as if there is no security at all with all routes accessible. Login and logout routes are non-existent as well.
That being said. Everything else appears to work fine, just without any security at all.
I don't have access to Weblogic as the client is the one deploying the code but they have told us that it's running on 12c. What can I do to fix or troubleshoot this?
Here's the relevant config from my 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
}
}
Thanks in advance.
It sounds as though you are running into SEC-2465. In short, there is a bug in WebLogic related to adding Filter instances. From the above JIRA:
The client should update their WebLogic server to get a fix. Alternatively, you can create your own version of AbstractSecurityWebApplicationInitializer that registers springSecurityFilterChain with the class method:
Your subclass of AbstractSecurityWebApplicationInitializer would then extend your custom class instead.
Update
Based on the updated information, I still contend the issue is related to the WebLogic bug mentioned above. When using SpringBootServletInitializer, the Filters are added with FilterRegistrationBean as an instance rather than a class.
The easiest option is to update to WebLogic since everything should work as is.
To workaround the issue, you can disable the registration of Spring Security and any other Filters. You can do this by creating a FilterRegistrationBean like the following:
Then you need to ensure the Filter is registered using
Spring Security can be registered with the above mechanism by implementing
WebApplicationInitializer
. For example, you can create the following class:DelegatingFilterProxy
will look up a bean of the name "springSecurityFilterChain" and delegate to it every time doFilter is invoked.I think you need to add the securityContextPersistenceFilter in the filter chain
I found the following comment in the SecurityContextPersistenceFilter class :
For completeness, if you're deploying to an older version of Weblogic with Servlet spec < 3.0 (e.g. 10.3.6 with 2.5), then you'll need to define the springSecurityFilterChain in your web.xml:
For the record and perhaps a little late, i recently ran into the same issue (amongst others) and got Spring Security (4.0.0.RELEASE) using Spring MVC (4.1.1.RELEASE) (not Spring Boot, so not using the
FilterRegistrationBean
as sugested above) working on Weblogic 12.1.3. With thanks to Rob Winch for the Filterchain addition (solving the problem of all url's being accessable without security). Implementing theWebApplicationInitializer
and overriding theonStart
method as follows does the trick: