【问题标题】:Spring injection of userdetailsservice in security config class fails安全配置类中 userdetailsservice 的 Spring 注入失败
【发布时间】:2015-10-08 16:13:49
【问题描述】:

我是 Spring Security 的新手,我正在尝试使用 java 对其进行配置,但是当我尝试将 UserDetailsS​​ervice 注入安全配置类时,我得到一个 404 错误页面,但是当我将其注入控制器时,注入工作。我正在使用 spring 版本 4.1.6 和 spring security 4.0.0

这是我的安全配置类

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

@Autowired
@Qualifier("loginService")
UserDetailsService loginService; //THIS IS THE POINT OF FAILURE

@Override
protected void configure(HttpSecurity http) throws Exception {
    http
    .csrf().disable()
        .authorizeRequests()
            .antMatchers("/").permitAll()
            .anyRequest().authenticated()
            .and()
        .formLogin()
            .loginPage("/")
            .usernameParameter("username")
            .passwordParameter("password")
            .defaultSuccessUrl("/userlist")
            .failureUrl("/")
            .permitAll()
            .and()
        .logout()
            .permitAll();
}

@Autowired
public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
    /*auth
        .inMemoryAuthentication()
            .withUser("user").password("password").roles("USER");*/
    auth.userDetailsService(loginService).passwordEncoder(passwordEncoder());
}

@Override
public void configure(WebSecurity web) throws Exception {

            web
              .ignoring()
                 .antMatchers("/resources/**");

          }


@Bean
public Md5PasswordEncoder passwordEncoder(){
    Md5PasswordEncoder encoder = new Md5PasswordEncoder();
    return encoder;
}
} 

这是 UserDetailsS​​ervice 类

@Service("loginService")
public class LoginService implements UserDetailsService{

@Autowired
UserRepository userRepository;

@Transactional
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {

    SiteUser user = userRepository.findByUsername(username);

    Collection<SimpleGrantedAuthority> authorities = new ArrayList<SimpleGrantedAuthority>();
     SimpleGrantedAuthority userAuthority = new SimpleGrantedAuthority("ROLE_USER");
     SimpleGrantedAuthority adminAuthority = new SimpleGrantedAuthority("ROLE_ADMIN");
    User u = null;
    if(user == null) 
        throw new UsernameNotFoundException("No such User: " + username);
    else
    {

        if (user.getRole().equals("USER"))
               authorities.add(userAuthority);

        else if (user.getRole().equals("ADMIN")) 
        {
               authorities.add(userAuthority);
               authorities.add(adminAuthority);
        }
        u = new User(user.getUsername(), user.getPassword(), authorities);
    }

    return u;
}

}

项目的其余部分可用 here

【问题讨论】:

  • 如果您发布了您获得的堆栈跟踪信息会有所帮助。

标签: spring spring-security


【解决方案1】:

解决方案是添加 @ComponentScan("com.ashken.*") 在 securityconfig 类之上

【讨论】:

    【解决方案2】:

    我发现在 SecurityConfig 中将 UserDetailsS​​ervice 的实现简单地注册为 bean 会更容易:

    @Configuration
    @EnableWebSecurity
    public class SecurityConfig extends WebSecurityConfigurerAdapter {
    
    @Autowired
    UserRepository userRepository;
    
    @Bean
    public UserDetailsService userDetailsService() {
      return new UserDetailsService() {
    
        @Transactional
        @Override
        public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
    
          SiteUser user = userRepository.findByUsername(username);
    
          Collection<SimpleGrantedAuthority> authorities = new ArrayList<SimpleGrantedAuthority>();
          SimpleGrantedAuthority userAuthority = new SimpleGrantedAuthority("ROLE_USER");
          SimpleGrantedAuthority adminAuthority = new SimpleGrantedAuthority("ROLE_ADMIN");
          User u = null;
          if(user == null) {
            throw new UsernameNotFoundException("No such User: " + username);
          } else {
    
            if (user.getRole().equals("USER")) {
              authorities.add(userAuthority);
            } else if (user.getRole().equals("ADMIN")) {
              authorities.add(userAuthority);
              authorities.add(adminAuthority);
            }
            u = new User(user.getUsername(), user.getPassword(), authorities);
          }
    
          return u;
        }
    
      };
    }
    
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
        .csrf().disable()
            .authorizeRequests()
                .antMatchers("/").permitAll()
                .anyRequest().authenticated()
                .and()
            .formLogin()
                .loginPage("/")
                .usernameParameter("username")
                .passwordParameter("password")
                .defaultSuccessUrl("/userlist")
                .failureUrl("/")
                .permitAll()
                .and()
            .logout()
                .permitAll();
    }
    
    @Autowired
    public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
        /*auth
            .inMemoryAuthentication()
                .withUser("user").password("password").roles("USER");*/
        auth.userDetailsService(loginService).passwordEncoder(passwordEncoder());
    }
    
    @Override
    public void configure(WebSecurity web) throws Exception {
    
                web
                  .ignoring()
                     .antMatchers("/resources/**");
    
              }
    
    
    @Bean
    public Md5PasswordEncoder passwordEncoder(){
        Md5PasswordEncoder encoder = new Md5PasswordEncoder();
        return encoder;
    }
    } 
    

    【讨论】:

    • 似乎每当我在该安全配置类中注入任何东西时,它都会失败。自动装配 userRepository 会导致与自动装配 userdetailsservice 相同的行为。
    • 没有堆栈跟踪。我只是得到一个 http 状态 404 页面。
    猜你喜欢
    • 2011-09-01
    • 1970-01-01
    • 2017-03-25
    • 2015-07-11
    • 2014-09-01
    • 2020-05-03
    • 2014-07-11
    • 2011-04-24
    • 2022-07-13
    相关资源
    最近更新 更多