【问题标题】:Impersonate java.lang.IllegalStateException: UserDetailsService is required模拟 java.lang.IllegalStateException:需要 UserDetailsS​​ervice
【发布时间】:2017-09-17 17:20:21
【问题描述】:

我正在尝试在 Spring 中使用 SwitchUserFilter 实现模拟,但出现错误。如果没有此实施,该项目运行良好。此外,该项目使用的是 Java 注释而不是 xml 配置,并且具有 SecureAuth 身份验证。而涉及到SecurityConfig类的代码部分是:

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

错误:

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

我的网址停在:

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

如果您需要更多代码,欢迎分享。

【问题讨论】:

  • @dur 是的,当我调试和评估 super.userDetailsServiceBean() 在字段 delegate 中包含 null
  • 你没有配置UserDetailsService,所以是null。你必须配置一个。
  • 对不起,我没有使用 Spring Security SAML 的经验,所以我不知道如何配置 UserDetailsService。也许这link 有帮助。
  • 问题是,SAML 使用他自己的接口SAMLUserDetailsService,它与 Spring Security 的UserDetailsService 不兼容。所以你没有 Spring Security UserDetailsService。也许唯一的方法是实现你自己的UserDetailsServiceSwitchFilter 一起使用。

标签: java spring-security saml impersonation spring-saml


【解决方案1】:

您可以尝试将userDetailsService 实现设置为配置,例如this 吗?

我没有在你的配置中看到:

auth.userDetailsService(userService);

【讨论】:

  • 还是不行。当我将auth.userDetailsService(userService); 添加到configure(AuthenticationManagerBuilder auth) 时,给我另一个错误switch java.lang.StackOverflowError,它将我重定向到这个问题(stackoverflow.com/questions/30766106/…)并且这个错误的解决方案被删除了 userDetailService 最近添加。所以我不知道..
  • 当然。您可以在这里看到,这是我当前的代码 (github.com/angelcuenca/stackoverflow/blob/master/…) 第 528 行。您可以看到有什么问题吗?
  • 我认为问题与您提供的链接相同。我在另一个实现 loadUserByUsername 方法的类中声明了我的 UserDetailsS​​ervice 实现。
  • Here。希望对您有所帮助。
  • 尚未找到解决方案。在另一个类中实现的结果是什么?
猜你喜欢
  • 2020-05-21
  • 2020-06-08
  • 2018-02-13
  • 1970-01-01
  • 1970-01-01
  • 2018-03-07
  • 2015-08-07
  • 2012-06-11
  • 1970-01-01
相关资源
最近更新 更多