繁体   English   中英

Spring Security无法使用userDetailService和passwordEncoder登录

[英]Spring Security unable to log using userDetailService and passwordEncoder

我使用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。 现在,我想使用存储在数据库中的信息以及哈希密码。

我终于找到了解决方案。 问题不是出自Spring Security。 它在应用程序的另一部分中。 如果有人想重用此代码,则可以使用!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM