[英]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);
}
}
在擴展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。 現在,我想使用存儲在數據庫中的信息以及哈希密碼。
我終於找到了解決方案。 問題不是出自Spring Security。 它在應用程序的另一部分中。 如果有人想重用此代碼,則可以使用!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.