Spring Security无法使用userDetailService和passwordEncoder进行日志记录

时间:2016-03-22 07:39:29

标签: java spring authentication spring-security bcrypt

我使用Spring Security,我想使用de userDetailService和passwordEncoder进行登录。

用户的创建工作正常。我的数据库中有用户有BCrypt密码。我使用相同的PasswordEncoder创建用户作为记录用户。

这是我的SecurityConfig:

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

  @Autowired
  private IUtilisateurService utilisateurService;

  @Override
  protected void configure(AuthenticationManagerBuilder auth) throws Exception {
     auth.userDetailsService(utilisateurService)
     .passwordEncoder(passwordEncoder())
    ;
  }

  @Override
  protected void configure(HttpSecurity http) throws Exception {
    http
    //
      .csrf().disable()
      //
      .authorizeRequests()//
      .antMatchers(HttpMethod.GET, "/**").permitAll()//
      .antMatchers(HttpMethod.POST, "/**").authenticated()//
      .antMatchers(HttpMethod.PUT, "/**").authenticated()//
      .antMatchers(HttpMethod.DELETE, "/**").authenticated()//
      .anyRequest().permitAll()//
      .and()//
      .httpBasic().and()//
      .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS);
  }

  @Bean
  public PasswordEncoder passwordEncoder() {
    return new BCryptPasswordEncoder(10);
  }

}

在扩展UserDetailsS​​ervice的IUtilisateurService的实现中:

@Service("utilisateurService")
public class UtilisateurServiceImpl implements IUtilisateurService {

  private static final ILogger LOG = LoggerImpl.getILogger(UtilisateurServiceImpl.class);

  private IUtilisateurDao utilisateurDao;

  private Mapper mapper;

  private PasswordEncoder passwordEncoder;

  @Autowired
  public UtilisateurServiceImpl(IUtilisateurDao utilisateurDao, Mapper mapper, PasswordEncoder passwordEncoder) {
    super();
    this.utilisateurDao = utilisateurDao;
    this.mapper = mapper;
    this.passwordEncoder = passwordEncoder;
  }

  @Override
  public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
    UtilisateurEntity utilisateur = utilisateurDao.getUtilisateurFromLogin(username);
    String methodName = "loadUserByUsername";
    if (utilisateur == null) {
      String msg = String.format("Aucun utilisateur avec le login %s n'a pu être trouvé", username);
      LOG.warning(methodName, msg);
      throw new UsernameNotFoundException(msg);
    }
    return new UtilisateurUserDetail(utilisateur);
  }

  @Override
  public void saveNewUtilisateur(String login, String motDePasse) {
    String methodName = "saveNewUtilisateur";
    if (StringUtils.isBlank(login) || StringUtils.isBlank(motDePasse)) {
      String message = "Le login et le mot de passe sont obligatoires";
      LOG.warning(methodName, message);
      throw new IllegalArgumentException(message);
    }
    UtilisateurEntity utilisateur = new UtilisateurEntity();
    utilisateur.setLogin(login);
    utilisateur.setMotDePasse(passwordEncoder.encode(motDePasse));
    LOG.info(methodName, String.format("Sauvegarde du nouvel utilisateur %s", login));
    utilisateurDao.saveNewUtilisateur(utilisateur);
  }
  ...

在此步骤之前,我在代码中使用了带有固定用户/密码的inMemoryAuthentication。现在我想使用散列密码来存储在数据库中的信息。

1 个答案:

答案 0 :(得分:0)

我终于找到了解决方案。 这个问题并非来自春季安全问题。它是应用程序的另一部分。如果有人想重复使用这段代码,那就可以了!