example java spring-security saml impersonation spring-saml

example - Suplantar java.lang.IllegalStateException: UserDetailsService es obligatorio



spring security java (1)

¿Puedes intentar establecer la implementación de userDetailsService en la configuración, como en esto ?

No veo en tu configuración:

auth.userDetailsService(userService);

Estoy intentando implementar la suplantación utilizando SwitchUserFilter en Spring, pero me aparece un error. El proyecto funciona bien sin esta implementación. Además, el proyecto está utilizando la configuración de Java, no la configuración xml y tiene autenticación SecureAuth. Y las partes involucradas en el código en la clase SecurityConfig son:

@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/**"); } }

Completa la clase SecurityConfig.java

Error:

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

Mi url se detiene en:

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

Si necesita más parte del código, placer de compartir.