J'utilise Spring 3 et j'obtiens des utilisateurs d'une base de données MySQL.Comment vérifier un mot de passe salé dans Spring Security?
À l'heure actuelle, lors des tests, j'ai un utilisateur avec un mot de passe MD5. Et je peux m'authentifier très bien en utilisant ça. Cependant, nous voulons être un peu plus en sécurité dans la façon dont nous haillons les mots de passe. Nous voulons:
MD5(username + salt + password)
Le sel est une chaîne aléatoire stockée dans l'enregistrement utilisateur. Mais je n'arrive pas à comprendre où et comment le faire. Voilà ce que j'ai jusqu'à présent:
UserDao
public class UserDao {
public static Users findUserByUsername(String paUsername) {
String hql = "from Users where username = :username";
List<Users> list = null;
Users user = null;
try {
IO io = new IO("web"); // custom Hibernate framework
IOQuery query = new IOQuery();
query.setStatement(hql);
query.setParameter(new IOParameter("username", paUsername));
list = io.runQuery(query);
if (list.isEmpty()) {
return null;
}
return list.get(0);
} catch (Exception ex) {
return null;
}
}
}
UserDetailsServiceImpl
@Service("userDetailsService")
public class UserDetailsServiceImpl implements UserDetailsService {
@Autowired
private UserDao userDao;
@Override
public UserDetails loadUserByUsername(String paUsername) throws UsernameNotFoundException {
Users user = userDao.findUserByUsername(paUsername);
if(user == null) {
throw new UsernameNotFoundException("User not found");
}
return new User(
user.getUsername(),
user.getPassword(),
user.getEnabled(),
true,
true,
true,
getAuthorities(Enums.UserRoles.IT));
}
private Collection<? extends GrantedAuthority> getAuthorities(Enums.UserRoles paRole) {
List<GrantedAuthority> authList = getGrantedAuthorities(getRoles(paRole));
return authList;
}
private List<String> getRoles(Enums.UserRoles paRole) {
List<String> roles = new ArrayList<>();
if (paRole.equals(Enums.UserRoles.USER)) {
roles.add(Enums.UserRoles.USER.name());
} else if (paRole.equals(Enums.UserRoles.IT)) {
roles.add(Enums.UserRoles.USER.name());
roles.add(Enums.UserRoles.IT.name());
}
return roles;
}
private static List<GrantedAuthority> getGrantedAuthorities(List<String> paRoles) {
List<GrantedAuthority> authorities = new ArrayList<>();
for (String role : paRoles) {
authorities.add(new SimpleGrantedAuthority(role));
}
return authorities;
}
}
UserDetailsService
public class UserDetailService implements UserDetailsService {
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
return new UserDetailsServiceImpl().loadUserByUsername(username);
}
}
sécurité app-contexte
<beans:bean id="loginSuccessHandler" class="com.myapp.security.LoginSuccessHandler" />
<beans:bean id="loginFailureHandler" class="com.myapp.security.LoginFailureHandler" />
<beans:bean id="detailsService" class="com.myapp.security.UserDetailService" />
Toutes les idées sur ce que je dois faire?
Merci
Comment puis-je faire référence à ce printemps? – cbmeeks
@cbmeeks utiliser 'String encryptedPassword = new PasswordEncoder(). EncoderPassword (passer, sel);'. Vérifiez l'API pour MessageDigestPasswordEncoder ici http://static.springsource.org/spring-security/site/docs/3.0.x/apidocs/org/springframework/security/authentication/encoding/MessageDigestPasswordEncoder.html –