首页 文章

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

提问于
浏览
0

我使用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);
  }

}

并且在扩展UserDetailsService的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

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

相关问题