我使用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。现在我想使用散列密码来存储在数据库中的信息。
答案 0 :(得分:0)
我终于找到了解决方案。 这个问题并非来自春季安全问题。它是应用程序的另一部分。如果有人想重复使用这段代码,那就可以了!