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.