34b050503d
- Rechtsseiten: Impressum-Platzhalter + echte Nutzungsbedingungen/AGB, Datenschutz (DSGVO) und Richtlinien; LegalController/ImpressumController, Footer app-weit verlinkt, Seiten als permitAll freigegeben. - FinalFlux: 28 Themen / ~742 Fragen überarbeitet (plausible Distraktoren statt Dummy-Antworten, echte Erklärungen) + echte Lehrtexte je Seite; Netzwerktopologien mit Inline-SVG-Diagrammen (Stern/Bus/Ring/Mesh/Baum). - Login/Registrierung als kombiniertes Dual-Panel (Slide-Overlay + Neon-Hover- Button), ausgelagert nach auth.css; Register-Duplikat -> /?registerError. - Konto löschen repariert: @Transactional + Löschen von Spielständen, Achievements und Profilbild-Datei (DSGVO Art. 17). Impressum-Zurück-Link login-abhängig. - App-weiter Farb-Relaunch auf "Back to the Future"-Palette: Feuer-Amber primär + Flux-Blau sekundär, warmer Glow; Dark/Light bleiben. Spiele-Feedback ohne Grün: richtig = Blau + Haken, falsch = Rot + Kreuz (neue Tokens --success/--danger/--secondary). Legacy-Cyan in style.css auf Variablen. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
73 lines
3.2 KiB
Java
73 lines
3.2 KiB
Java
package com.example.mindflux.config;
|
|
|
|
import com.example.mindflux.model.User;
|
|
import com.example.mindflux.repository.UserRepository;
|
|
import org.springframework.context.annotation.Bean;
|
|
import org.springframework.context.annotation.Configuration;
|
|
import org.springframework.security.authentication.AuthenticationManager;
|
|
import org.springframework.security.config.annotation.authentication.configuration.AuthenticationConfiguration;
|
|
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
|
|
import org.springframework.security.core.userdetails.*;
|
|
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
|
|
import org.springframework.security.web.SecurityFilterChain;
|
|
import org.springframework.security.web.util.matcher.AntPathRequestMatcher;
|
|
|
|
@Configuration
|
|
public class SecurityConfig {
|
|
|
|
@Bean
|
|
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
|
|
http
|
|
.authorizeHttpRequests(auth -> auth
|
|
.requestMatchers("/", "/login", "/register", "/impressum", "/nutzungsbedingungen", "/datenschutz", "/richtlinien", "/css/**", "/js/**", "/img/**").permitAll()
|
|
.requestMatchers("/admin/**").hasRole("ADMIN") // NEU: Adminbereich absichern
|
|
.requestMatchers("/api/users/**").hasRole("ADMIN")
|
|
.anyRequest().authenticated()
|
|
)
|
|
.formLogin(form -> form
|
|
.loginPage("/") // login.html liegt auf "/"
|
|
.loginProcessingUrl("/login")
|
|
.defaultSuccessUrl("/dashboard", true)
|
|
.failureUrl("/?error") // zeigt Loginfehler an
|
|
.permitAll()
|
|
)
|
|
.logout(logout -> logout
|
|
// Logout-Links in den Templates sind GET -> GET-Logout erlauben, sonst 404/Fehler unter CSRF
|
|
.logoutRequestMatcher(new AntPathRequestMatcher("/logout", "GET"))
|
|
.logoutSuccessUrl("/?logout")
|
|
.permitAll()
|
|
)
|
|
.csrf(csrf -> csrf
|
|
// Spiele-APIs werden per fetch (application/json) ohne Token aufgerufen -> ausnehmen.
|
|
// Reine JSON-Endpunkte sind nicht über klassische HTML-Formulare CSRF-ausnutzbar.
|
|
.ignoringRequestMatchers("/api/games/**", "/api/techtacular/**", "/api/mindmatch/**")
|
|
);
|
|
|
|
return http.build();
|
|
}
|
|
|
|
@Bean
|
|
public UserDetailsService userDetailsService(UserRepository userRepo) {
|
|
return username -> {
|
|
User user = userRepo.findByUsername(username)
|
|
.orElseThrow(() -> new UsernameNotFoundException("Benutzer nicht gefunden"));
|
|
|
|
return org.springframework.security.core.userdetails.User
|
|
.withUsername(user.getUsername())
|
|
.password(user.getPassword())
|
|
.roles(user.getRole()) // Achtung: Nur ein String, z.B. "USER" oder "ADMIN"
|
|
.build();
|
|
};
|
|
}
|
|
|
|
@Bean
|
|
public BCryptPasswordEncoder passwordEncoder() {
|
|
return new BCryptPasswordEncoder();
|
|
}
|
|
|
|
@Bean
|
|
public AuthenticationManager authenticationManager(AuthenticationConfiguration config) throws Exception {
|
|
return config.getAuthenticationManager();
|
|
}
|
|
}
|