Hallo, ich bin ziemlich verwirrt was die Authentifizierung angeht und hab einige Fragen.
So definiere ich die Rollen:
Und so sieht der Controller aus:
Das klappt soweit sehr gut. Nur verstehe ich nicht, warum es funktioniert. Die Methode
Mein Code ist ja momentan ziemlich statisch. Wie gehe ich vor, wenn ich das Ganze dynamisch haben möchte? Muss sich denn die Methode
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?
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?

