I am trying to configure a REST-based web application in which the front end uses Reactjs and the backend uses Spring Boot. I am also trying to set up a custom authentication provider, and this is where my problems begin. When trying to verify the login API call, the CustomAuthenticationProvider is never called, but instead the standard DaoAuthenticationProvider is used. This causes the login to report "Bad credentials."
I downloaded a small sample application on github: spring-boot-auth-demo
To check the login API, I use the following curl:
curl -H "Content-Type: application/json" -X POST -d '{"username":"admin","password":"admin"}' http://localhost:8080/api/users/login
CustomAuthenticationProvider performs a simple username and password verification and returns a UsernamePasswordAuthenicationToken object.
package no.bluebit.demo; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.security.authentication.AuthenticationProvider; import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; import org.springframework.security.core.Authentication; import org.springframework.security.core.AuthenticationException; import org.springframework.security.core.GrantedAuthority; import org.springframework.security.core.authority.SimpleGrantedAuthority; import org.springframework.stereotype.Component; import java.util.ArrayList; import java.util.List; @Component public class CustomAuthenticationProvider implements AuthenticationProvider { private static final Logger logger = LoggerFactory.getLogger(CustomAuthenticationProvider.class); public CustomAuthenticationProvider() { logger.info("*** CustomAuthenticationProvider created"); } @Override public Authentication authenticate(Authentication authentication) throws AuthenticationException { if(authentication.getName().equals("admin") && authentication.getCredentials().equals("admin")) { List<GrantedAuthority> grantedAuths = new ArrayList<>(); grantedAuths.add(new SimpleGrantedAuthority("ROLE_USER")); grantedAuths.add(new SimpleGrantedAuthority("ROLE_ADMIN")); return new UsernamePasswordAuthenticationToken(authentication.getName(), authentication.getCredentials(), grantedAuths); } else { return null; } } @Override public boolean supports(Class<?> authentication) { return UsernamePasswordAuthenticationToken.class.isAssignableFrom(authentication); } }
CustomAuthenticationProvider is connected using the SecurityConfiguration class. When viewing the code, I see that CustomAuthenicationProvider is not in the list of providers used to authenticate the incoming request.
package no.bluebit.demo; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Configuration; import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; @Configuration @EnableWebSecurity @EnableGlobalMethodSecurity(prePostEnabled = true, securedEnabled = true) public class SecurityConfiguration extends WebSecurityConfigurerAdapter { @Autowired private CustomAuthenticationProvider customAuthenticationProvider; @Override protected void configure(AuthenticationManagerBuilder auth) throws Exception { auth .authenticationProvider(this.customAuthenticationProvider); } @Override protected void configure(HttpSecurity http) throws Exception { http .authorizeRequests() .antMatchers("/api/users/login").permitAll()
Why is this not working?
java spring authentication rest spring-security
HΓ₯vard Bakke
source share