Spring Security Passwort-Authentifizierung
brauchen Sie Hilfe oder Richtung, die mit Spring security 3.1.x.
Ich bin die Speicherung eines verschlüsselten Passworts in der MySql-Datenbank. Welches Passwort ist definiert als ein varchar(60) - Spalte.
Ersten mal läuft der web-app, generiert ich das Passwort mit dem folgenden code-snippet:
String p = "12345";
PasswordEncoder passwordEncoder = new BCryptPasswordEncoder();
String encodedPassword = passwordEncoder.encode(p);
Nahm ich dann den String encodedPassword und eingefügt werden in der Spalte in der Datenbank. Hielt ich den code in meinem authentication-manager (snippet folgt), und protokolliert encodedPassword an den server melden.
<security:authentication-manager alias="authenticationManager">
<security:authentication-provider user-service-ref="usersDAO">
<security:password-encoder ref="encoder" />
</security:authentication-provider>
</security:authentication-manager>
<bean id="encoder" class="org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder" />
Mein problem ist, dass die Authentifizierung fehlschlägt, mit Ausnahme: Bad-Anmeldeinformationen, wenn BCryptPasswordEncoder.matches() ausgeführt wird. Das gespeicherte Passwort ist nicht in übereinstimmung mit der erzeugten hash aus der Eingabe in ein Formular. Die gleichen text-Passwort, die verwendet wurde, in den ersten hash Erzeugung verwendet wurde.
Jedes mal, wenn ich re-run der login-Eingabe den gleichen text, der protokolliert encodedPassword ist anders. Debuggen kann ich sehen, wo die entity wird aus der Datenbank zurückgegeben korrekt, also denke ich nicht, das ist ein Problem. Das Problem scheint mir, dass ich es nicht mache/Einstellung etwas richtig in Ordnung zu generieren, die denselben hash jedes mal, wenn der text
Passwort eingegeben wird.
BEARBEITEN:
Hinzufügen usersDAO.
import org.springframework.security.core.userdetails.UserDetailsService;
public interface UsersDAO extends Dao<Users>, UserDetailsService
{
Users getByUsername(String username);
}
BEARBEITEN:
hinzufügen von Implementierung.
import org.springframework.dao.DataAccessException;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@Repository("usersDAO")
public class UsersDAO_DB extends AbstractHibernateDao<Users> implements UsersDAO
{
final Logger log = LoggerFactory.getLogger(this.getClass());
@Override
public Users getByUsername(String username)
{
String p = "12345";
PasswordEncoder passwordEncoder = new BCryptPasswordEncoder();
String encodedPassword = passwordEncoder.encode(p);
log.debug("HELLOZ ----> " + encodedPassword);
notNull(username, "username can't be null");
return (Users) getSession()
.getNamedQuery("users.byUsername")
.setParameter("username", username)
.uniqueResult();
}
@Override
@Transactional
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException, DataAccessException {
notNull(username, "username can't be null");
Users users = getByUsername(username);
if (users == null) {
throw new UsernameNotFoundException("No user with username " + username);
}
return users;
}
@Override
public void create(Users t)
{
//TODO Auto-generated method stub
}
@Override
public void update(Users t)
{
//TODO Auto-generated method stub
}
@Override
public void delete(Users t)
{
//TODO Auto-generated method stub
}
}
Irgendwelche Ideen?
InformationsquelleAutor Ron | 2013-10-24
Du musst angemeldet sein, um einen Kommentar abzugeben.
Das war ein newbie-Fehler hier folgenden ein paar verschiedene tutorials.
In der Bohne hatte ich mein security-encoder als:
org.springframework.Sicherheit.crypto.bcrypt.BCryptPasswordEncoder
Generieren Sie ein test-kryptische Passwort habe ich verwendet folgenden code:
wurde das mischen der org.springframework.Sicherheit.crypto.Passwort.PasswordEncoder und die org.springframework.Sicherheit.crypto.bcrypt.BCryptPasswordEncoder. Siehe oben den code definieren passwordEncoder.
Sobald ich es geändert:
kopiert die Ausgabe zu meiner Datenbank und getestet, alles funktionierte gut.
InformationsquelleAutor Ron
Wo ist das logging aus? Spring Security nicht eingehende Passwörter und wenn Sie mit BCrypt sollte es nicht re-Codierung Sie von Grund überall.
Es klingt wie Sie möglicherweise re-encoding das eingegebene Passwort selbst, möglicherweise in Ihrer
usersDAO
welche nicht angezeigt.Wenn nicht, poste bitte deine komplette Konfiguration und das logging-Ausgabe, die Sie sprechen.
Die hashes werden immer Verschieden sein, da BCrypt verwendet ein anderes Salz jedes mal, so dass nichts zu bedeuten hat. Ich würde immer noch vermuten, dass etwas Los ist in Ihrem eigenen DAO. Die Schnittstelle, die Sie gebucht habe, keinen code, so, wenn Sie post von der tatsächlichen Umsetzung es ist schwer zu sagen.
Sorry, ich wusste nicht genau, was Sie brauchen. Wenn du mehr brauchst lass es mich wissen. Ich gesammelt, dass das Salz war, die den unvergleichlichen Passwörter, aber das war alles, was ich in der Lage war, sich zu versammeln.
InformationsquelleAutor Shaun the Sheep