Spring Security: Wie kommt 'UserDetails' an Username und Passwort ran?

RezaScript

Bekanntes Mitglied
Hallo,

ich habe ein Problem mit der Implementierung der Klasse UserDetails. Ich habe den Username und Passwort des Users in PostgreSQL gespeichert und möchte ihn dadurch authentifizieren.

Java:
public class CustomUserDetails implements UserDetails {
    private final User user;

    public CustomUserDetails(User user) {
        this.user = user;
    }

    @Override
    public Collection<? extends GrantedAuthority> getAuthorities() {
        return null;
    }

    @Override
    public String getPassword() {
        return this.user.getPassword();
    }

    @Override
    public String getUsername() {
        return user.getUsername();
    }

    @Override
    public boolean isAccountNonExpired() {
        return true;
    }

    @Override
    public boolean isAccountNonLocked() {
        return true;
    }

    @Override
    public boolean isCredentialsNonExpired() {
        return true;
    }

    @Override
    public boolean isEnabled() {
        return true;
    }
}

Ich bekomme die Fehlermeldung
Cannot invoke "com.example.auth.User.getPassword()" because "this.user" is null

Ich verstehe ehrlich gesagt auch nicht, wie diese Klasse überhaupt an die Daten von Username und Passwort rankommen sollte, wenn diese in Controller definiert werden.

Den ganzen Code findet ihr hier: https://github.com/RezaS/Login-with-Spring-Security
 
Y

yfons123

Gast
Java:
    public CustomUserDetails(User user) {
        this.user = user;
    }
hier setzt du null ein und rufst dann null.getPassword() auf und das wirft die exception

warum sollte das passwort eigentlich jemals den server verlassen'? was will der user damit? der weis es doch , ansonsten hätte er sich nicht anmelden können
 

KonradN

Super-Moderator
Mitarbeiter
Also im CustomUserDetailsService solltst du immer prüfen, ob user null ist um ggf. eine Exception zu werfen. Das hast Du in Deinem Code nicht. Es kann also schlicht daran scheitern, dass Du versuchst einen User zu authentifizieren, der nicht in der Datenbank ist.

Aber ich sehe bei Dir keine XML Konfiguration. Oder habe ich jetzt falsch geschaut?

Ich verstehe ehrlich gesagt auch nicht, wie diese Klasse überhaupt an die Daten von Username und Passwort rankommen sollte, wenn diese in Controller definiert werden.
Das ist ja die Konfiguration, die Du in dem Beispiel siehst. Da hast Du dann die Konfiguration:
Java:
<bean id="myUserDetailsService"
  class="org.baeldung.security.MyUserDetailsService"/>

<security:authentication-manager>
    <security:authentication-provider
      user-service-ref="myUserDetailsService" >
        <security:password-encoder ref="passwordEncoder">
        </security:password-encoder>
    </security:authentication-provider>
</security:authentication-manager>
    
<bean id="passwordEncoder"
  class="org.springframework.security
  .crypto.bcrypt.BCryptPasswordEncoder">
    <constructor-arg value="11"/>
</bean>

Das erste brauchst Du nicht, denn SpringBoot scant ja die Packages ab der SpringBootApplication und findet den Bean.
Aber den password encoder und den authentication manager gibst Du nicht an so ich das richtig gesehen habe (Aber evtl. habe ich das auch einfach nur übersehen - im Webbrowser durch die Verzeichnisse zu gehen ist nicht optimal.

Und in Spring Boot würde ich das ohne XML machen ... und da hat man dann eine Methode wie:
Java:
@Bean
public PasswordEncoder encoder() {
    return new BCryptPasswordEncoder();
}
Statt dem XML bean=passwordEncoder Teil

Und das mit dem Service würde dann so in der Art aussehen:
Java:
@Autowired
private CustomUserDetailsService userDetailsService;

@Bean
public DaoAuthenticationProvider authProvider() {
    DaoAuthenticationProvider authProvider = new DaoAuthenticationProvider();
    authProvider.setUserDetailsService(userDetailsService);
    authProvider.setPasswordEncoder(encoder());
    return authProvider;
}

Beider ist bei mir mit in einer Klasse - sonst geht das encoder() nicht ... wobei man das natürlich auch per AutoWire bekommen kann in einer anderen Klasse.
 

RezaScript

Bekanntes Mitglied
@KonradN vielen Dank für deine ausführliche Antwort!

Also im CustomUserDetailsService solltst du immer prüfen, ob user null ist um ggf. eine Exception zu werfen. Das hast Du in Deinem Code nicht. Es kann also schlicht daran scheitern, dass Du versuchst einen User zu authentifizieren, der nicht in der Datenbank ist.
Das habe ich gemacht. Siehe hier.

Aber ich sehe bei Dir keine XML Konfiguration. Oder habe ich jetzt falsch geschaut?
Nein, da liegst du komplett richtig. Ich versuche das Ganze ohne XML zu machen.

Ich habe nun encoder() und authProvider() in die Konfigurationsdatei eingepackt.

Wenn ich die Applikation nun laufen lasse, bekomme ich folgende Fehlermeldung:
org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'customUserDetailService' defined in file [C:\Users\rsaad\IdeaProjects\auth\target\classes\com\example\auth\config\CustomUserDetailService.class]: Unsatisfied dependency expressed through constructor parameter 0: Error creating bean with name 'userRepository' defined in com.example.auth.UserRepository defined in @EnableJpaRepositories declared on JpaRepositoriesRegistrar.EnableJpaRepositoriesConfiguration: Not a managed type: class com.example.auth.User

Was mache ich falsch?
 

KonradN

Super-Moderator
Mitarbeiter
Hattest Du nicht einen anderen Thread, in dem Dir schon zu der Persistence etwas gesagt wurde?

Schmeiße die Abhängigkeit raus, die Du diesbezüglich in Deinem POM hast. Spring Boot bringt diesbezüglich alles mit!

Damit hast Du kein javax.persistence mehr und das ändert sich zu jakarta.persistence.* (Ist ja Spring Boot 3, was Du da nutzen willst wenn ich das richtig gesehen habe!)

Und schon ist der Fehler weg - und du bekommst natürlich den nächsten :)

In der Klasse configurator hast Du nicht nur den Namen klein geschrieben sondern userDetailsService wird nie gesetzt, daher ein @Autowired setzen:
Java:
public class configurator {

    @Autowired
    private CustomUserDetailService customUserDetailService;

Die Klasse com.example.auth.user ist kein Managed Type, also keine Entity.
Schon, aber von einem alten javax.persisentence.Entity und nicht vom erwarteten jakarta.persistence.Entity. :)
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
R Spring Security: Wie den User dynamisch authentifizieren? Frameworks - Spring, Play, Blade, Vaadin & Co 8
R Spring Security: Authentication & Permissions Frameworks - Spring, Play, Blade, Vaadin & Co 4
T Spring Security: Run-as replacement Einsatzbereich? Frameworks - Spring, Play, Blade, Vaadin & Co 1
T Spring Security Config File anpassen Frameworks - Spring, Play, Blade, Vaadin & Co 1
S Spring Security mit oauth2 in lokaler Konfiguration principal mocken Frameworks - Spring, Play, Blade, Vaadin & Co 0
M Java Spring Security Frameworks - Spring, Play, Blade, Vaadin & Co 5
M Spring Security Login with Credentials Frameworks - Spring, Play, Blade, Vaadin & Co 0
OnDemand Spring Security/Boot/Vaadin Cookie Problem bei iFrame Frameworks - Spring, Play, Blade, Vaadin & Co 4
8u3631984 Spring security - 403 bei Role Access Regel Frameworks - Spring, Play, Blade, Vaadin & Co 6
Dimax Spring Security CSRF-Token Frameworks - Spring, Play, Blade, Vaadin & Co 5
Dimax Spring Security Probleme Frameworks - Spring, Play, Blade, Vaadin & Co 2
OnDemand Spring Boot + Vaadin API Security Frameworks - Spring, Play, Blade, Vaadin & Co 1
OnDemand Buchempfehlung Spring Security Frameworks - Spring, Play, Blade, Vaadin & Co 17
iman Spring Security Frameworks - Spring, Play, Blade, Vaadin & Co 13
S Spring Security deaktivieren Frameworks - Spring, Play, Blade, Vaadin & Co 10
S Spring Boot Security Frameworks - Spring, Play, Blade, Vaadin & Co 3
B Spring tools security mit JSP Frameworks - Spring, Play, Blade, Vaadin & Co 6
K Spring Security für Java SE Frameworks - Spring, Play, Blade, Vaadin & Co 2
M Konfiguration von Spring Security für httpBasic Auth und jdbc Authentication. Frameworks - Spring, Play, Blade, Vaadin & Co 3
P Spring Security Token vs. Cookie Frameworks - Spring, Play, Blade, Vaadin & Co 0
I Security mit JBoss oder Spring oder... Frameworks - Spring, Play, Blade, Vaadin & Co 1
M Spring Security URLs erlauben Frameworks - Spring, Play, Blade, Vaadin & Co 0
K JSF 2.1 und Spring 3 Security Login mit RememberMe Frameworks - Spring, Play, Blade, Vaadin & Co 1
F.S.WhiTeY Spring Security Constrain: Allow connection from localhost always Frameworks - Spring, Play, Blade, Vaadin & Co 1
F Spring Security Beans Frameworks - Spring, Play, Blade, Vaadin & Co 7
E Fehlermeldung von Spring Security beim Einloggen Frameworks - Spring, Play, Blade, Vaadin & Co 1
B Security mit Spring oder Seam Frameworks - Spring, Play, Blade, Vaadin & Co 6
M Problem mit spring security Frameworks - Spring, Play, Blade, Vaadin & Co 0
C JSF 2.0 Spring Security 3 User eingeloggt? Frameworks - Spring, Play, Blade, Vaadin & Co 1
D Webanwendung und Spring Security Ratschlag Frameworks - Spring, Play, Blade, Vaadin & Co 6
T JSF - Spring Security Integration Frameworks - Spring, Play, Blade, Vaadin & Co 0
G Spring Security Frameworks - Spring, Play, Blade, Vaadin & Co 4
R Spring Security RMI Frameworks - Spring, Play, Blade, Vaadin & Co 2
I Spring Security: Login und danach Methode aufrufen. Nur wie?? Frameworks - Spring, Play, Blade, Vaadin & Co 0
G Spring Security Leerzeichen Frameworks - Spring, Play, Blade, Vaadin & Co 7
G Spring Security Frameworks - Spring, Play, Blade, Vaadin & Co 1
G Spring Security - Angemeldet bleiben Frameworks - Spring, Play, Blade, Vaadin & Co 4
G Spring Security Beispielprogramm [DRINGEND] Frameworks - Spring, Play, Blade, Vaadin & Co 1
D Spring Security 3 und JSF 2.0 Frameworks - Spring, Play, Blade, Vaadin & Co 5
G Spring Security Konfiguration Frameworks - Spring, Play, Blade, Vaadin & Co 0
D Spring Security Benutzer ermitteln Frameworks - Spring, Play, Blade, Vaadin & Co 3
P Spring Security mit Datenbank Frameworks - Spring, Play, Blade, Vaadin & Co 5
I Spring Security 404 Fehler bei Login -> Findet Seite nicht Frameworks - Spring, Play, Blade, Vaadin & Co 0
I Eigene Login Funktion bei Spring Security Frameworks - Spring, Play, Blade, Vaadin & Co 5
I Menüsteuerung mit Spring Security Frameworks - Spring, Play, Blade, Vaadin & Co 0
ARadauer Spring Security - Setting the SecurityContextHolder Contents Directly Frameworks - Spring, Play, Blade, Vaadin & Co 1
M JSF Navigation - Spring Security Logout Problem Frameworks - Spring, Play, Blade, Vaadin & Co 5
S Spring Security Tutorial ohne Web application Frameworks - Spring, Play, Blade, Vaadin & Co 4
MQue Spring Security Frameworks - Spring, Play, Blade, Vaadin & Co 12
8u3631984 Ist es möglich in Spring Entity generische Listen verwenden Frameworks - Spring, Play, Blade, Vaadin & Co 3
R Spring Boot Test Assertions mit Objekten Frameworks - Spring, Play, Blade, Vaadin & Co 6
8u3631984 Pfad zu Test Datei in application.yml in Spring Boot Test Frameworks - Spring, Play, Blade, Vaadin & Co 7
R Spring Boot sql Beziehungen Frameworks - Spring, Play, Blade, Vaadin & Co 12
8u3631984 Spring JPA Probleme beim SPeichern von Sets Frameworks - Spring, Play, Blade, Vaadin & Co 3
M Spring Boot 3 Datenbanken zur Laufzeit Verbinden Frameworks - Spring, Play, Blade, Vaadin & Co 5
8u3631984 Spring JDBC Probleme beim Spaltennamen Frameworks - Spring, Play, Blade, Vaadin & Co 3
LimDul Spring-Batches in Docker über Rest starten/verfolgen Frameworks - Spring, Play, Blade, Vaadin & Co 0
ExceptionOfExpectation In Meiner Spring-Boot Applikation verlangt die Datenbank Wert für eine ID Frameworks - Spring, Play, Blade, Vaadin & Co 5
H Spring Boot Applikation und JHM Benchmark sowie ContextConfiguration in H2 Tests ich bekomme es nicht hin Frameworks - Spring, Play, Blade, Vaadin & Co 2
ExceptionOfExpectation Tests in Spring-Boot Frameworks - Spring, Play, Blade, Vaadin & Co 4
R Eure Erfahrungen mit Primefaces und Spring - wer managed die Beans Frameworks - Spring, Play, Blade, Vaadin & Co 4
Avalon Get Request doppelt abfeuern ohne Post Redirect Get Pattern. Spring Boot Thymeleaf MVC Frameworks - Spring, Play, Blade, Vaadin & Co 12
thor_norsk Konfigurationsprobleme mit Spring Boot Frameworks - Spring, Play, Blade, Vaadin & Co 9
R Spring Boot Integration-testing mit Keycloak Frameworks - Spring, Play, Blade, Vaadin & Co 1
R Spring Boot Integration-testing mit Keycloak Frameworks - Spring, Play, Blade, Vaadin & Co 13
L Spring Data und Rest Controller? Frameworks - Spring, Play, Blade, Vaadin & Co 4
thor_norsk Spring Boot Fehler Frameworks - Spring, Play, Blade, Vaadin & Co 1
L Spring Data und Rest Conroller? Frameworks - Spring, Play, Blade, Vaadin & Co 4
thor_norsk Spring Boot und Docker Frameworks - Spring, Play, Blade, Vaadin & Co 5
B Spring Amazon-SP-Api Frameworks - Spring, Play, Blade, Vaadin & Co 3
8u3631984 Aktualisiere Spring Controller Frameworks - Spring, Play, Blade, Vaadin & Co 4
L Spring Data: Modellierung mit einer Embeddable bean Frameworks - Spring, Play, Blade, Vaadin & Co 2
D Spring Boot Test ob Validation geprüft wurde Frameworks - Spring, Play, Blade, Vaadin & Co 8
K Spring Boot OneToMany Frameworks - Spring, Play, Blade, Vaadin & Co 6
8u3631984 Spring Boot Docker Image erstellen und mit docker-compose konfigurieren Frameworks - Spring, Play, Blade, Vaadin & Co 1
M Wann Spring Batch nutzen? Frameworks - Spring, Play, Blade, Vaadin & Co 1
P Spring Hessian Remote Beispiel Frameworks - Spring, Play, Blade, Vaadin & Co 20
8u3631984 Spring 2.7.8 Info Enpoint nicht zuerreichen Frameworks - Spring, Play, Blade, Vaadin & Co 1
gradlew.bat spring-boot:run funktioniert nicht Frameworks - Spring, Play, Blade, Vaadin & Co 4
Zrebna Spring Boot/Thymeleaf: Bestätigungsemail senden. Frameworks - Spring, Play, Blade, Vaadin & Co 2
Zrebna Spring - Thymeleaf: Wieso wird gem. Fallunterscheidung entsprechende View nicht geladen? Frameworks - Spring, Play, Blade, Vaadin & Co 3
Dimax Spring UsernameNotFoundException(msg); auf der View msg ausdrücken Frameworks - Spring, Play, Blade, Vaadin & Co 1
Dimax Spring UsernameNotFoundException(Message) auf der View Message ausdrücken Frameworks - Spring, Play, Blade, Vaadin & Co 2
B Spring Boot und JPA Error creating bean Frameworks - Spring, Play, Blade, Vaadin & Co 24
R Spring Boot: Warum soll PasswordEncoder in einer neuen Methode definiert sein? Frameworks - Spring, Play, Blade, Vaadin & Co 1
8u3631984 Cross-Origin beim Abrufen von Spring Endpoint Frameworks - Spring, Play, Blade, Vaadin & Co 1
D Spring Boot und Microservices Frameworks - Spring, Play, Blade, Vaadin & Co 1
M Spring Boot additional Datasource for a single entity Frameworks - Spring, Play, Blade, Vaadin & Co 0
T Spring Resourcen Ordner ermitteln Frameworks - Spring, Play, Blade, Vaadin & Co 5
B Spring JPA und Repository Frameworks - Spring, Play, Blade, Vaadin & Co 12
D Mapstruct Dependency Injection funktioniert nicht mit Spring Frameworks - Spring, Play, Blade, Vaadin & Co 15
Avalon Wie sieht bei Euch das Deployment einer Spring Boot Anwendung aus? Frameworks - Spring, Play, Blade, Vaadin & Co 4
M Threads in Spring Boot Frameworks - Spring, Play, Blade, Vaadin & Co 7
W DI-Problem in Spring Boot Frameworks - Spring, Play, Blade, Vaadin & Co 4
T Spring Boot: Was bewirkt parent in maven genau? Frameworks - Spring, Play, Blade, Vaadin & Co 4
OnDemand Vaadin+Spring Boot erster Seitenload nach Neustart endlos Frameworks - Spring, Play, Blade, Vaadin & Co 0
doncarlito87 Wie erhalte ich ein JSON aus eine NativeQuery (Spring Boot)? Frameworks - Spring, Play, Blade, Vaadin & Co 8
Avalon @Query Select Abfrage liefert falsche Werte (Spring Boot, JPA, Hibernate) Frameworks - Spring, Play, Blade, Vaadin & Co 3
Avalon Erstellung Dockerimage mit spring-boot:build-image in Spring Boot mit Umgebungsvariablen Frameworks - Spring, Play, Blade, Vaadin & Co 0
N Spring Integration - Logging Frameworks - Spring, Play, Blade, Vaadin & Co 7

Ähnliche Java Themen

Neue Themen


Oben