Spring Security Custom Authentication und Passwort-Kodierung

Gibt es ein tutorial gibt, oder hat jemand Hinweise, wie das folgende zu tun mit Spring-Security?

Aufgabe:

Ich brauche, um das Salz aus meiner Datenbank für die Authentifizierung Benutzername und es verwenden, um zu verschlüsseln das Passwort zur Verfügung gestellt (aus der login-Seite) zum vergleichen der gespeicherten verschlüsselten Passwort (ein.k.ein. die Authentifizierung des Benutzers).

zusätzliche Informationen:

Ich benutze eine benutzerdefinierte Datenbank-Struktur. Ein UserDetails Objekt angelegt wird, über eine eigene UserDetailsService die wiederum verwendet eine benutzerdefinierte DAOProvider, um die Informationen aus der Datenbank.

meine security.xml Datei so weit:

<authentication-manager>
    <authentication-provider user-service-ref="userDetailsService">
    </authentication-provider>
</authentication-manager>

nun ich denke, ich werde müssen

        <password-encoder hash="sha" />

aber was sonst? Wie kann ich sagen, spring security, verwenden Sie die databaseprovided Salz, um zu Kodieren, das Passwort?


Bearbeiten:

Fand ich Diese SO post informatative, aber nicht ausreichend: Wenn ich definieren einer Salz-Quelle in meinem xml verwendet werden, indem der Passwort-encoder, etwa so:

        <password-encoder ref="passwordEncoder">                
            <salt-source ref="saltSource"/>
        </password-encoder>

Werde ich haben, so schreiben Sie einen benutzerdefinierten SaltSource, um meine custom Salz. Aber das ist nicht zu sein gefunden innerhalb der UserDetails Objekt. So...

Alternative 1:

Kann ich eine benutzerdefinierte Implementierung der UserDetails das könnte dann die Salz-Eigenschaft?

<beans:bean id="saltSource" class="path.to.MySaltSource"
    p:userPropertyToUse="salt"/>

und

@Service("userDetailsService") 
public class UserDetailsServiceImpl implements UserDetailsService {
    public UserDetails loadUserByUsername(String username)
            throws UsernameNotFoundException, DataAccessException {

        //...
        return buildUserFromAccount(account);
    }

    @Transactional(readOnly = true)

    UserDetailsImpl buildUserFromAccount(Account account){

        //... build User object that contains salt property
}

benutzerdefinierte User-Klasse:

public class UserDetailsImpl extends User{

    //...

    private String salt;

    public String getSalt() { return salt; }

    public void setSalt(String salt) { this.salt = salt; }
}

security.xml:

<authentication-manager>
    <authentication-provider user-service-ref="userDetailsService">
        <password-encoder hash="sha">                
        <salt-source ref="saltSource"/>
    </password-encoder>
    </authentication-provider>
</authentication-manager>

<beans:bean id="saltSource" class="org.springframework.security.authentication.dao.ReflectionSaltSource" p:userPropertyToUse="salt"/>

Alternative 2:

Sonst würde ich Spritzen muß meine accountDAO in die SaltSource um das Salz zu extrahieren, die für eine gegebene userName aus der Datenbank.

ABER: Wie funktioniert die Spring Security rufen Sie die SaltSource? Immer mit saltSource.getSalt(userDetails)?

Dann würde ich nur noch sicherstellen, dass meine SaltSource verwendet userDetails.accountName auf meine accountDAO zum abrufen der Salz.


Edit2:

Gerade erfahren, dass mein Ansatz ist.. Vermächtnis.. 🙁 Also ich denke, ich werde einfach verwenden Sie die StandardPasswordEncoder (die ich noch habe, um herauszufinden, wie genau).

BTW: ich habe implementiert die erste option mit einer benutzerdefinierten UserDetails-Klasse, die sich der User-Klasse und nur das hinzufügen einer Salz-Eigenschaft, die einen dann an die SaltSource als userPropertyToUse so wie es vorgeschlagen wurde, in der sogenannten post erwähnt Bearbeiten 1...


EDIT 3:

Habe gerade die StandardPasswordEncoder arbeiten, so lasse ich einige Hinweise hier:

Verwenden Sie die StandardPasswordEncoder für die Authentifizierung:

<beans:bean id="encoder" 
    class="org.springframework.security.crypto.password.StandardPasswordEncoder">
</beans:bean>


<authentication-manager>
    <authentication-provider user-service-ref="userDetailsService">
        <password-encoder ref="encoder" />         
    </authentication-provider>
</authentication-manager>

Dies erfordert die spring-security-Krypto-Modul in der version 3.1.0.RC? so weit ich weiß. Konnte nicht finden, dass jedes repository hat eine 3.0. version (obwohl, irgendwo hatte es die Versionen, die aufgeführt sind, enthalten 3.0.6 und so weiter). Auch die Dokumentationen spricht über spring security 3.1 so dass ich dachte, ich geh mal mit.

Beim anlegen eines Benutzers (für mich nur ein admin kann), benutze ich einfach

        StandardPasswordEncoder encoder = new StandardPasswordEncoder();
        String result = encoder.encode(password);

bin ich dann fertig.

Spring security wird nach dem Zufallsprinzip erstellen Sie ein Salz, und fügen Sie es den Passwort-string vor der Speicherung in der Datenbank, so kein Salz Spalte mehr benötigt.

Kann man aber auch ein globaler Salz als Konstruktor-argument (new StandardPasswordEncoder("12345");), aber ich wusste nicht, wie meine security-Konfiguration, die zum abrufen der Wert einer bean-statt der Lieferung einer statischen string mit <constructor-arg name="secret" value "12345" />. Aber ich weiß nicht, wie viel nötig ist, sowieso.

InformationsquelleAutor der Frage Pete | 2011-10-05

Schreibe einen Kommentar