Po namyśle postanowiłem zamienić swoją konfiguracje XML na JavaConfig, lecz oczywiście nie natknąłem się na masę błędów. Wiekszość rozwiązałem, ale z jednym nie mogę sobie poradzić. Posiadam autoryzowane logowanie w JavaConfig
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
.anyRequest().authenticated()
.and()
.formLogin()
.loginPage("/login")
.defaultSuccessUrl("/loginSuccessfully")
.failureUrl("/login?error=true")
.usernameParameter("username")
.passwordParameter("password")
.and()
.logout()
.logoutUrl("/logout")
.logoutSuccessUrl("/logout")
.and()
.csrf();
}
natomiast w XML wyglądało to tak
<http auto-config="true" use-expressions="true">
<form-login login-page="/login" default-target-url="/loginSuccessfully" authentication-failure-url="/login?error=true" username-parameter="username" password-parameter="password" />
<logout logout-success-url="/login" />
<csrf />
</http>
IDENTYCZNIE. Podczas konfiguracji XML działało, a teraz w JavaConfig nie. Natomiast problem polega na tym, że podczas logowania nie jest "używane" Spring Security. Po naciśnięciu na przycisk zaloguj szuka metody oznaczonej 'POST'.
Startowa konfiguracja wygląda tak
@Configuration
public class WebInit extends AbstractAnnotationConfigDispatcherServletInitializer {
@Override
protected Class<?>[] getRootConfigClasses() {
return null;
}
@Override
protected Class<?>[] getServletConfigClasses() {
return new Class[] {WebConfig.class,
WebSecurityConfig.class,
WebDatasourceConfig.class};
}
@Override
protected String[] getServletMappings() {
return new String[] {"/"};
}
}
a to cały WebSpringConfig
@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(securedEnabled = true, prePostEnabled = true)
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
private DataSource dataSource;
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
.anyRequest().authenticated()
.and()
.formLogin()
.loginPage("/login")
.defaultSuccessUrl("/loginSuccessfully")
.failureUrl("/login?error=true")
.usernameParameter("username")
.passwordParameter("password")
.and()
.logout()
.logoutUrl("/logout")
.logoutSuccessUrl("/logout")
.and()
.csrf();
}
@Autowired
public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
auth.jdbcAuthentication()
.passwordEncoder(passwordEncoder())
.dataSource(dataSource)
.usersByUsernameQuery("SELECT username, password, enabled FROM users WHERE username=?")
.authoritiesByUsernameQuery("SELECT username, ‘ROLE_USER’ FROM users WHERE username=?");
}
@Bean
public BCryptPasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder(12);
}
}
Według mnie nie ma błędu w Spring Security, tylko może gdzieś zrobiłem pomyłkę i nie puściłem odpowiedniego skanowania.