How can I define a custom Authentication provider by using Spring Security with Java Configurations? I would like to perform a login checking credentials on my own database.
            Asked
            
        
        
            Active
            
        
            Viewed 3.5k times
        
    21
            
            
        - 
                    spring security documentations gives you all the info you need - how to configure your configuration' XML and endpoints. in addition, you will have to support flows like "create account", "forgot password", etc, which you can use this open source: https://github.com/OhadR/oAuth2-sample/tree/master/authentication-flows – OhadR Mar 24 '14 at 10:37
2 Answers
45
            The following does what you need (CustomAuthenticationProvider is your implementation which needs to be managed by Spring)
@Configuration
@EnableWebMvcSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
    @Autowired
    private CustomAuthenticationProvider customAuthenticationProvider;
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        /**
         * Do your stuff here
         */
    }
    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.authenticationProvider(customAuthenticationProvider);
    }
}
 
    
    
        geoand
        
- 60,071
- 24
- 172
- 190
- 
                    1Is it possible to register a custom authentication provider in addition to the existing ones? – Display name Jun 10 '16 at 10:23
- 
                    @Seppl I dont think that something like that exists out of the box (although I could easily be mistaked), but I'm pretty sure that something like that could be implemented relatively easily. Check out [this](http://stackoverflow.com/a/36417101/2504224) – geoand Jun 10 '16 at 11:04
- 
                    1According to the Spring Docu, `auth.authenticationProvider()` will "Add authentication based upon the custom AuthenticationProvider that is passed in." I'd guess that you get a stack of providers in this way. – Christoph Grimmer Sep 20 '17 at 11:40
8
            
            
        As shown on baeldung.com, define your authentication provider as follow:
@Component
public class CustomAuthenticationProvider implements AuthenticationProvider {
    @Override
    public Authentication authenticate(Authentication authentication) 
      throws AuthenticationException {
        String name = authentication.getName();
        String password = authentication.getCredentials().toString();
        if (shouldAuthenticateAgainstThirdPartySystem(username, password)) {
            // use the credentials
            // and authenticate against the third-party system
            return new UsernamePasswordAuthenticationToken(
              name, password, new ArrayList<>());
        } else {
            return null;
        }
    }
    @Override
    public boolean supports(Class<?> authentication) {
        return authentication.equals(
          UsernamePasswordAuthenticationToken.class);
    }
}
and following code is corresponding java config:
@Configuration
@EnableWebSecurity
@ComponentScan("org.project.security")
public class SecurityConfig extends WebSecurityConfigurerAdapter {
    @Autowired
    private CustomAuthenticationProvider authProvider;
    @Override
    protected void configure(
      AuthenticationManagerBuilder auth) throws Exception {
        auth.authenticationProvider(authProvider);
    }
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests().anyRequest().authenticated()
            .and()
            .httpBasic();
    }
}
- 
                    7You just copied that straight from http://www.baeldung.com/spring-security-authentication-provider . While the answer is certainly helpful, attributing sources is necessary as well. – moritz Aug 07 '17 at 10:10
 
     
    