Od wersji Spring Boot 2.7 mamy wiele aktualizacji o których więcej dowiesz się z oficjalnego Patch Notes.
Dziś jednak przyjmy się najciekawszej zmianie – wśród aktualizacji pojawiła się nowa wersja Spring Security w ramach której dochodzi do rezygnacji z nadpisywania metod konfiguracyjnych pochodzących z WebSecurityConfigurerAdapter na rzecz definiowania odpowiednich beanów. To podejście jest bardziej spójne względem innych modułów Spring Boota, a ponadto wydajniejsze. Dodatkowo Twórcy Spring Boota zalecają wykorzystywanie lambd do implementacji.
Dla przybliżenia Ci tematu przygotowałem przykład definiowania użytkowników InMemory, a następnie zarządzanie ich dostępami. W pierwszej kolejności pokażę Ci rozwiązanie (starsze) dla wersji < 2.7, a następnie analogiczne rozwiązanie utrzymane w standardach nowego podejścia, które dotyczy wersji >= 2.7.
Klasa konfiguracyjna dla wersji < 2.7
@Configuration
public class SpringSecurityConfig extends WebSecurityConfigurerAdapter {
@Bean
public PasswordEncoder getBcryptPasswordEncoder() {
return new BCryptPasswordEncoder();
}
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
User user = new User("Jan",
getBcryptPasswordEncoder().encode("jan123"),
Collections.singleton(new SimpleGrantedAuthority("ROLE_USER")));
User admin = new User("admin",
getBcryptPasswordEncoder().encode("admin123"),
Collections.singleton(new SimpleGrantedAuthority("ROLE_ADMIN")));
auth.inMemoryAuthentication().withUser(user);
auth.inMemoryAuthentication().withUser(admin);
}
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
.antMatchers("/for-user").hasAnyRole("USER", "ADMIN")
.antMatchers("/for-admin").hasAuthority("ROLE_ADMIN")
.and()
.formLogin().permitAll()
.and()
.logout().logoutUrl("/bye");
}
}
Klasa konfiguracyjna dla wersji >= 2.7
@Configuration
public class SpringSecurityConfigNew {
@Bean
public PasswordEncoder getBcryptPasswordEncoder() {
return new BCryptPasswordEncoder();
}
@Bean
public InMemoryUserDetailsManager get() {
UserDetails user = User.withUsername("jan")
.password(getBcryptPasswordEncoder().encode("jan123"))
.roles("USER")
.build();
UserDetails admin = User.withUsername("admin")
.password(getBcryptPasswordEncoder().encode("admin123"))
.roles("ADMIN")
.build();
return new InMemoryUserDetailsManager(Arrays.asList(user, admin));
}
@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
http
.authorizeRequests((autz) -> autz
.antMatchers("/for-user").hasAnyRole("USER", "ADMIN")
.antMatchers("/for-admin").hasAuthority("ROLE_ADMIN")
)
.formLogin((formLogin) -> formLogin.permitAll())
.logout()
.logoutSuccessUrl("/bye").permitAll();
return http.build();
}
}
Zapis ze szkolenia Live
A jeśli chcesz zobaczyć zobaczyć implementacje rozwiazań z wykorzystnaiem Spring Security w formie wideo, to zapraszam na ponad godzinny materiał obejmujący:
Uwierzytelnianie i Autoryzacja na przykładach
OAuth2 w integracji z Facebook
Nowości w Spring Boot (Security) od wersji 2.7
Najnowsze zmiany dotyczące Spring Security opisuje również w swoim LiveBooku ➜ https://LiveBooks.pl.
Zobacz listę szkoleń


