Spring Security: Wie den User dynamisch authentifizieren?

RezaScript

Bekanntes Mitglied
Hallo, ich bin ziemlich verwirrt was die Authentifizierung angeht und hab einige Fragen.

So definiere ich die Rollen:

Java:
@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class ApplicationSecurityConfig  {
    private final PasswordEncoder passwordEncoder;

    @Autowired
    public ApplicationSecurityConfig(PasswordEncoder passwordEncoder) {
        this.passwordEncoder = passwordEncoder;
    }

@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
    http
            .csrf().disable()
            .authorizeRequests()
            .antMatchers("/", "index", "/css/*", "js/*").permitAll()
            .antMatchers("/api/**").hasRole(STUDENT.name())
            .anyRequest()
            .authenticated()
            .and()
            .httpBasic();
    return http.build();
}

    @Bean
    public InMemoryUserDetailsManager userDetailsManager() {
        var annaSmith = User.builder()
                .username("annasmith")
                .password(passwordEncoder.encode("password"))
                .roles("ADMIN")
                .build();

        var linda = User.builder()
                .username("linda")
                .password(passwordEncoder.encode("pass"))
                .roles("USER")
                .build();

        var tom = User.builder()
                .username("tom")
                .password(passwordEncoder.encode("pass"))
                .roles("USER")
                .build();

        return new InMemoryUserDetailsManager(annaSmith, linda, tom);
    }
}

Und so sieht der Controller aus:

Java:
@GetMapping
@PreAuthorize("hasAnyRole('ROLE_ADMIN', 'ROLE_ADMINTRAINEE')")
public List<Student> getAllStudents() {
    return STUDENTS;
}

Das klappt soweit sehr gut. Nur verstehe ich nicht, warum es funktioniert. Die Methode userDetailsManager() rufe ich ja nirgends auf. Heisst das, dass sich die Annotation @PreAuthorize selbstständig darum kümmert?

Mein Code ist ja momentan ziemlich statisch. Wie gehe ich vor, wenn ich das Ganze dynamisch haben möchte? Muss sich denn die Methode userDetailsManager() zwingend in der Config-Datei befinden, oder kann ich sie auch im Service vom Login nehmen?

Und muss der User denn jedesmal eine Rolle zugewiesen bekommen, wenn er sich einloggt? Macht es denn nicht mehr Sinn, wenn die Rolle beim Registrieren in der DB gespeichert wird?
 

LimDul

Top Contributor
Da ist eine @Bean Annotation dran. Damit läuft das alles über Dependency Injection.

Wenn sich ein Benutzer einloggt, sucht Springt eine Bean vom Typ UserDetailManager über die normalen Spring-Lookup Mechanismen. Und fragt dann darüber die User-Details ab. Wie die Implementierung deines UserDetailManager aussieht, bleibt dir überlassen. Es gibt auch viele Default-Implementierungen um z.B. in einem Active Directory oder Ldap oder ähnliches nachzuschlagen.
 

RezaScript

Bekanntes Mitglied
Hmm, also ich hab das Ganze mal so ausprobiert:

Java:
@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class Config {
    @Bean
    public PasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder(10);
    }

    @Bean
    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
        http
                //.csrf().disable()
                .authorizeRequests()
                .antMatchers("/login").permitAll()
                .antMatchers("/welcome").hasAnyRole("ADMIN")
                .anyRequest()
                .authenticated()
                .and()
                .formLogin(form -> form.loginPage("/login").permitAll());
        return http.build();
    }

    @Bean
    public InMemoryUserDetailsManager userDetailsManager() {
        var linda = User.builder()
                .username("linda")
                .password(passwordEncoder().encode("pass"))
                .roles("ADMIN")
                .build();
        return new InMemoryUserDetailsManager(linda);
    }
}

Java:
@RestController
public class LoginController {
    @PostMapping("/login")
    public ResponseEntity<String> login(@RequestBody User user) {
        if (user.getUsername().equals("linda") && user.getPassword().equals("pass")) {
            return ResponseEntity.ok("Access granted");
        }
        return ResponseEntity.badRequest().body("Access denied");
    }
}

Ich bekomme aber einen 405-Status.

login.png

Was mache ich falsch?
 

Oneixee5

Top Contributor
form.loginPage("/login") erwarte das per GET eine HTML-Seite/Form ausgeliefert wird. Dein Controller stellt aber nur ein POST auf /login zur Verfügung.
 

RezaScript

Bekanntes Mitglied
Ich habe mein /login-Endpoint nun komplett entfernt und habe es mal so ausprobiert:

Java:
@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class Config {
    @Bean
    public PasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder(10);
    }

    @Bean
    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
        http
                .csrf().disable()
                .authorizeRequests()
                .antMatchers("/login", "/loginFailed").permitAll()
                .antMatchers("/welcome").hasAnyRole("ADMIN").anyRequest()
                .authenticated().and()
                .formLogin(form -> form.loginPage("/login")
                        .usernameParameter("username")
                        .passwordParameter("password")
                        .defaultSuccessUrl("/welcome")
                        .failureUrl("/loginFailed"));
        return http.build();
    }

    @Bean
    public InMemoryUserDetailsManager userDetailsManager() {
        var linda = User.builder()
                .username("linda")
                .password(passwordEncoder().encode("pass"))
                .roles("ADMIN")
                .build();
        return new InMemoryUserDetailsManager(linda);
    }
}

Java:
@RestController
public class LoginController {
    @GetMapping("/welcome")
    public ResponseEntity<String> welcome(Authentication authentication) {
        return ResponseEntity.ok("Welcome " + authentication.getName());
    }

    @GetMapping("/loginFailed")
    public ResponseEntity<String> loginFailed() {
        return ResponseEntity.ok("Failed to login");
    }
}

login.png

Das scheint jedenfalls gut zu funktionieren. Aber wenn ich danach /welcome aufrufe, bekomme ich wieder den 405-Status.

Wie kann ich eingeloggt bleiben?
 

Oneixee5

Top Contributor
Wenn du eine loginPage konfigurierst, dann musst du auch eine bereitstellen, ansonsten einfach nur:
....and() .formLogin()
dann generiert Spring Boot selbst eine Login-Page.
die Namen der Parameter sind richtig aber Spring Boot erwartet, dass du die HTML-Header richtig zurücksendest, mindestens die Cookies.
 

RezaScript

Bekanntes Mitglied
@Oneixee5 mit formLogin() generiert Spring Boot für mich ein Formular. Dieses Formular möchte ich aber gar nicht haben.

Das Login-Formular erstelle ich mit Angular. Heisst das, dass ich die URL vom Frontend eingeben muss? Also so: .formLogin(form -> form.loginPage("http://localhost:4200/login") ?
 

Oneixee5

Top Contributor
@Oneixee5 mit formLogin() generiert Spring Boot für mich ein Formular. Dieses Formular möchte ich aber gar nicht haben.

Das Login-Formular erstelle ich mit Angular. Heisst das, dass ich die URL vom Frontend eingeben muss? Also so: .formLogin(form -> form.loginPage("http://localhost:4200/login") ?
Mit Angular habe ich das noch nicht gemacht. Wegen csrf mache ich das fast immer über thymleaf.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
C JSF 2.0 Spring Security 3 User eingeloggt? Frameworks - Spring, Play, Blade, Vaadin & Co 1
R Spring Security: Wie kommt 'UserDetails' an Username und Passwort ran? Frameworks - Spring, Play, Blade, Vaadin & Co 6
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
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