2016-02-12 5 views
7

Es gibt mehrere Referenzen von mehreren Authentifizierungsprovidern im Frühjahr Sicherheit, aber kein Beispiel in Java-Konfiguration konnte gefunden werden.Java Spring Sicherheitskonfiguration - mehrere Authentifizierungsanbieter

Die folgenden Link, um die XML-Notation gibt: Multiple Authentication Providers in Spring Security

Wir brauchen Code unsere Probe mit LDAP oder DB

Below zu authentifizieren:

@Configuration 
@EnableWebSecurity 
public class XSecurityConfig extends WebSecurityConfigurerAdapter { 

    @Autowired 
    private AuthenticationProvider authenticationProvider; 

    @Autowired 
    private AuthenticationProvider authenticationProviderDB; 


    @Override 
    @Order(1) 

    protected void configure(AuthenticationManagerBuilder auth) throws Exception { 
     auth.authenticationProvider(authenticationProvider); 
    } 


    @Order(2) 
    protected void configureGlobal(AuthenticationManagerBuilder auth) throws Exception { 
     auth.authenticationProvider(authenticationProviderDB); 
    } 

    @Override 
     public void configure(WebSecurity web) throws Exception { 
     web 
      .ignoring() 
      .antMatchers("/scripts/**","/styles/**","/images/**","/error/**"); 
     } 
    ______ 

    @Override 
    @Order(1) 
    protected void configure(HttpSecurity http) throws Exception { 
     http.csrf().disable() 
     .authorizeRequests() 
      .antMatchers("/","/logout","/time").permitAll() 
        .antMatchers("/admin").hasRole("ADMIN")   
         .anyRequest().authenticated() 
      .and() 
     .formLogin() 
      .loginPage("/index") 
      .loginProcessingUrl("/perform_login") 
      .usernameParameter("email") 
      .passwordParameter("password") 
      .failureUrl("/index?failed=true") 
      .defaultSuccessUrl("/summary",true) 
      .permitAll() 
      .and() 
     .logout().logoutUrl("/logout") 
        .logoutSuccessUrl("/index?logout=true").permitAll() 
      .and() 
      .exceptionHandling().accessDeniedPage("/error403") 
     .and().authenticationProvider(authenticationProvider); 

    } 

    @Order(1) 
    protected void configureDB(HttpSecurity http) throws Exception { 
     http.csrf().disable() 
     .authorizeRequests() 
      .antMatchers("/","/logout").permitAll() 
      .anyRequest().authenticated() 
      .and() 
     .formLogin() 
      .loginPage("/index") 
      .loginProcessingUrl("/perform_login") 
      .usernameParameter("email") 
      .passwordParameter("password") 
      .failureUrl("/index?failed=true") 
      .defaultSuccessUrl("/summary",true) 
      .permitAll() 
      .authenticationProvider(authenticationProviderDB) 
    //This line giving compilation error stating authenticationProvider is not available in formloginconfigurer 

     .and() 
     .logout().logoutUrl("/logout") 
        .logoutSuccessUrl("/index?logout=true").permitAll() 
      .and() 
      .exceptionHandling().accessDeniedPage("/error403"); 
    } 

} 
+0

Rufen 'authenticationProvider' mehrmals mit verschiedenen' AuthenticationProvider' Instanzen. Beide werden in der angegebenen Reihenfolge registriert und konsultiert. –

Antwort

7

diese Ihnen helfen können sein: -

@Configuration 
@EnableWebSecurity 
@Profile("container") 
public class XSecurityConfig extends WebSecurityConfigurerAdapter { 

@Autowired 
private AuthenticationProvider authenticationProvider; 

@Autowired 
private AuthenticationProvider authenticationProviderDB; 

@Override 
@Order(1) 

protected void configure(AuthenticationManagerBuilder auth) throws Exception { 
    auth.authenticationProvider(authenticationProvider); 
} 

@Order(2) 
protected void configureGlobal(AuthenticationManagerBuilder auth) throws Exception { 
    auth.authenticationProvider(authenticationProviderDB); 
} 

@Override 
    public void configure(WebSecurity web) throws Exception { 
    web 
     .ignoring() 
     .antMatchers("/scripts/**","/styles/**","/images/**","/error/**"); 
    } 

@Override 
public void configure(HttpSecurity http) throws Exception { 
    http 
      .authorizeRequests() 
      .antMatchers("/rest/**").authenticated() 
      .antMatchers("/**").permitAll() 
      .anyRequest().authenticated() 
      .and() 
      .formLogin() 
      .successHandler(new AuthenticationSuccessHandler() { 
       @Override 
       public void onAuthenticationSuccess(
         HttpServletRequest request, 
         HttpServletResponse response, 
         Authentication a) throws IOException, ServletException { 
          //To change body of generated methods, 
          response.setStatus(HttpServletResponse.SC_OK); 
         } 
      }) 
      .failureHandler(new AuthenticationFailureHandler() { 

       @Override 
       public void onAuthenticationFailure(
         HttpServletRequest request, 
         HttpServletResponse response, 
         AuthenticationException ae) throws IOException, ServletException { 
          response.setStatus(HttpServletResponse.SC_UNAUTHORIZED); 
         } 
      }) 
      .loginProcessingUrl("/access/login") 
      .and() 
      .logout() 
      .logoutUrl("/access/logout")     
      .logoutSuccessHandler(new LogoutSuccessHandler() { 
       @Override 
       public void onLogoutSuccess(
         HttpServletRequest request, 
         HttpServletResponse response, 
         Authentication a) throws IOException, ServletException { 
        response.setStatus(HttpServletResponse.SC_NO_CONTENT); 
       } 
      }) 
      .invalidateHttpSession(true) 
      .and() 
      .exceptionHandling() 
      .authenticationEntryPoint(new Http403ForbiddenEntryPoint()) 
      .and() 
      .csrf()//Disabled CSRF protection 
      .disable(); 
    } 
} 
+0

Vielen Dank, probieren Sie es aus. Ich sehe keine Referenz von authenticationProviderDB oder authenticationProvider (die ldap darstellt) –

+0

Wie funktioniert das ohne diese Referenzen –

+0

hier, dass '.authenticated()' jede Anfrage authentifizieren, die Sie von 'antMatcher erhalten, dann wird es den Status setzen in seinem successHandler –

4

Dies ist eine erfolgreiche Konfiguration, mit der Sie mehrere Authentifizierungsanbieter in java config konfigurieren können. Vielen Dank für Ihre Eingaben. Es half dabei, das Problem zu lösen. Der Schlüssel ist

@Autowired 
public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception { 
    auth.authenticationProvider(authenticationProvider); 
    auth.authenticationProvider(authenticationProviderDB); 

} 

Voll Code unten

@Configuration 
@EnableWebSecurity 
public class XSecurityConfig extends WebSecurityConfigurerAdapter { 

    @Autowired 
    private LDAPAuthenticationProvider authenticationProvider; 

    @Autowired 
    private DBAuthenticationProvider authenticationProviderDB; 

    @Override 
     public void configure(WebSecurity web) throws Exception { 
     web 
      .ignoring() 
      .antMatchers("/scripts/**","/styles/**","/images/**","/error/**"); 
     } 

    @Autowired 
    public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception { 
     auth.authenticationProvider(authenticationProvider); 
     auth.authenticationProvider(authenticationProviderDB); 

    } 


    @Override 
    protected void configure(HttpSecurity http) throws Exception { 
     http.csrf().disable() 
     .authorizeRequests() 
      .antMatchers("/","/logout").permitAll() 
      .antMatchers("/admin").hasRole("ADMIN")   
      .anyRequest().authenticated() 
      .and() 
     .formLogin() 
      .loginPage("/index") 
      .loginProcessingUrl("/perform_login") 
      .usernameParameter("user") 
      .passwordParameter("password") 
      .failureUrl("/index?failed=true") 
      .defaultSuccessUrl("/test",true) 
      .permitAll() 
      .and() 
     .logout().logoutUrl("/logout") 
        .logoutSuccessUrl("/index?logout=true").permitAll() 
      .and() 
      .exceptionHandling().accessDeniedPage("/error"); 
    } 


} 
5

In Frühling Stiefel das für mich gearbeitet haben:

Jeder Authentifizierungsanbieter, um getestet wird. Wenn man geht, dann sind seine folgenden Authentifizierungsanbieter

übersprungenen

auth.userDetailsService(userDetailsService)...

dann:

auth.ldapAuthentication()....

@EnableRedisHttpSession 
@Configuration 
@EnableWebMvcSecurity 
public class WebSecurityConfig extends WebSecurityConfigurerAdapter { 

@Autowired 
private CustomUserDetailsService userDetailsService; 

@Autowired 
public void configAuthentication(AuthenticationManagerBuilder auth) throws Exception { 

    //each Authentication provider is tested in order 
    //if one passes then its following Authentication providers are skipped 

    //DataBase Authentication 
    auth.userDetailsService(userDetailsService).passwordEncoder(passwordencoder()); 



    LdapContextSource ldapContextSource = new LdapContextSource(); 


    ldapContextSource.setUrl("ldap://192.168.XXX.XXX:389"); 
    ldapContextSource.setBase("dc=companyname,dc=com"); 
    ldapContextSource.setUserDn("cn=user,cn=testgroup,ou=Test,dc=companyname,dc=com"); 
    ldapContextSource.setPassword("user1234"); 
    ldapContextSource.afterPropertiesSet(); 



    //LDAP Authentication 
    auth.ldapAuthentication() 
     //The {0} in the (uid={0}) will be replaced by the username entered in the form. 
     .userSearchBase("ou=Group") 
     .userSearchFilter("uid={0}") 

     //.userDnPatterns("uid={0},ou=people")//does the same thing 

     //Specifies where the search for Roles start 
     //.groupSearchBase("ou=mathematicians") 
     //in groups we search for member 
     //.groupSearchFilter("member={0}") 
     //.contextSource().ldif("classpath:test-server.ldif"); 

    .contextSource(ldapContextSource); 



} 

@Override 
protected void configure(HttpSecurity http) throws Exception { 

    http.authorizeRequests() 


      .antMatchers("/hello").access("hasRole('ROLE_ADMIN')") 
      .antMatchers("/index").fullyAuthenticated() 
      .antMatchers("/").fullyAuthenticated() 
      .antMatchers("/home").fullyAuthenticated() 
      .anyRequest().permitAll() 

      .and() 
      .formLogin() 
       .loginPage("/login") 
       .permitAll() 
       .usernameParameter("username").passwordParameter("password") 
      .and() 
      .logout() 
       .logoutSuccessUrl("/login?logout") 
       .permitAll() 
      .and() 
       .exceptionHandling() 
       .accessDeniedPage("/403") 
      .and() 
       .csrf() 
       .disable(); 



} 

@Bean(name = "passwordEncoder") 
public PasswordEncoder passwordencoder() { 
    return new BCryptPasswordEncoder(); 
} 
} 
Verwandte Themen