2017-04-20 5 views
10

J'essaye d'implémenter l'usurpation d'identité en utilisant SwitchUserFilter au printemps mais j'obtiens une erreur. Le projet fonctionne bien sans cette implémentation. Le projet utilise également la configuration Java et non la configuration xml et l'authentification SecureAuth. Et les parties impliquées dans le code dans la classe SecurityConfig est:Impersonate java.lang.IllegalStateException: UserDetailsService est requis

@Configuration 
@ComponentScan(basePackages = {"com.project.*"}) 
@EnableWebMvcSecurity 
@EnableGlobalMethodSecurity(securedEnabled = true) 
@PropertySource("classpath:app.properties") 
@Import({TransactionManagersConfig.class, MailConfig.class}) 
public class SecurityConfig extends WebSecurityConfigurerAdapter { 

    @Autowired 
    private SwitchUserFilter switchUserFilter; 

    @Autowired 
    protected AuthenticationSuccessHandler authenticationSuccessHandler; 

    @Bean 
    public UserDetailsService userDetailsServiceBean() { 
    try { 
     return super.userDetailsServiceBean(); 
    } catch (Exception e) { 
     throw new RuntimeException(e); 
    } 
    } 

    @Bean 
    public SwitchUserFilter switchUserFilter() { 
    SwitchUserFilter switchUserFilter = new SwitchUserFilter(); 
    switchUserFilter.setUserDetailsService(userDetailsServiceBean()); 
    switchUserFilter.setUsernameParameter("username"); 
    switchUserFilter.setSwitchUserUrl("/switch"); 
    switchUserFilter.setExitUserUrl("/exit"); 
    switchUserFilter.setTargetUrl("/"); 

    return switchUserFilter; 
    } 

    //more beans 

    @Override 
    protected void configure(HttpSecurity http) throws Exception { 
     http 
       .headers().disable(); 
     http //SAML CONFIG 
       .httpBasic() 
       .authenticationEntryPoint(samlEntryPoint()).and() 
       .addFilterBefore(metadataGeneratorFilter(), ChannelProcessingFilter.class) 
       .addFilterAfter(samlFilter(), BasicAuthenticationFilter.class); 
     http //DISABLE CROSS-SITE REQUEST FORGERY 
       .csrf() 
       .disable(); 
       //Impersonate Interceptor 
     http 
       .addFilterAfter(switchUserFilter(), FilterSecurityInterceptor.class); 
     http 
       .authorizeRequests() 
       .antMatchers("/impersonate").permitAll() 
       .antMatchers("/api/**").permitAll() 
       .antMatchers("/#/**").permitAll() 
       .antMatchers("/switch").permitAll() 
       .antMatchers("/login").permitAll() 
       .anyRequest().authenticated() 
       .and() 
       .formLogin().loginPage("/index") 
       .permitAll().successHandler(authenticationSuccessHandler); 
     http 
       .logout().logoutSuccessUrl(env.getProperty("realm.url.restart")); 
     http 
       .exceptionHandling().accessDeniedPage("/error?code=403&error=Access Denied&detail=You are not authorized to access."); 

    }  

    @Bean 
    @Override 
    public AuthenticationManager authenticationManagerBean() throws Exception { 
     return super.authenticationManagerBean(); 
    }  

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

    @Override 
    public void configure(WebSecurity webSecutity) throws Exception { 
     webSecutity 
       .ignoring().antMatchers("/resources/**"); 
    } 
} 

classe complète SecurityConfig.java

Erreur:

java.lang.IllegalStateException: UserDetailsService is required. 
    at org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter$UserDetailsServiceDelegator.loadUserByUsername(WebSecurityConfigurerAdapter.java:393) 
    at org.springframework.security.web.authentication.switchuser.SwitchUserFilter.attemptSwitchUser(SwitchUserFilter.java:209) 
    at org.springframework.security.web.authentication.switchuser.SwitchUserFilter.doFilter(SwitchUserFilter.java:155) 
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) 
    at 

Mon url arrête sur:

http://localhost:8080/switch?j_username=angel_cuenca 

Si vous besoin de plus d'une partie du code, plaisir de partager.

+0

@dur oui quand je déboguer et 'super.userDetailsServiceBean évalue()' 'contient null' dans le champ' delegate' –

+0

Vous n'avez pas configuré un 'UserDetailsService', c'est donc' null'. Vous devez en configurer un. – dur

+0

Désolé, je n'ai aucune expérience avec Spring Security SAML, donc je ne sais pas comment configurer 'UserDetailsService'. Peut-être que ce [link] (https://www.dontpanicblog.co.uk/2014/05/07/saml-based-single-sign-on-sso-in-spring-security-applications/) aide. – dur

Répondre

0

Pouvez-vous essayer de définir l'implémentation userDetailsService sur la configuration, comme dans this?

Je ne vois pas dans votre configuration:

auth.userDetailsService(userService); 
+0

Ne fonctionne toujours pas. Lorsque j'ajoute 'auth.userDetailsService (userService);' à 'configure (AuthenticationManagerBuilder auth)' me donne une autre erreur 'switch java.lang.StackOverflowError' qui me redirige vers cette question (http://stackoverflow.com/questions/30766106/spring-security-java-lang-stackoverflowerror-exception-after-all-providers) et la solution pour cette erreur a été supprimée userDetailService récemment ajouté. Donc je ne sais pas .. –

+0

Bien sûr. Vous pouvez voir ici, c'est mon code actuel (https://github.com/angelcuenca/stackoverflow/blob/master/SecurityConfig.java) ligne 528. Vous pouvez voir quel est le problème? –

+0

Je pense que le problème est le même avec le lien que vous fournissez. Je déclare mon implémentation UserDetailsService dans une autre classe qui implémente la méthode loadUserByUsername. – Erwin