Merhaba Arkadaşlar, Bu yazımızda Spring Boot 3.1 altındaki sürümlerde oluşturduğunuz spring security configlerimizi spring boot 3.1 sürümüne uyarlacağız.
Bir kaç ay önce spring boot 3.2 kararlı sürüm yayınlandı ve bu sürümde önemli değişiklikler ve güzellikler springe eklendi. Tüm değişiklikleri buradan görebilirsiniz. Dilerseniz lafı dolandırmadan direk konuya girelim.
Spring 3 öncesi sürümlerde WebSecurityConfig classımız hemen hemen aşağıda ki gibidir.
@Configuration @EnableWebSecurity public class WebSecurityConfiguration extends WebSecurityConfigurerAdapter { // kodlar }
Ve sınıf içindeki configure metodumuz:
@Override protected void configure(HttpSecurity http) throws Exception { http.cors() .disable() .csrf().disable() .authorizeRequests() .antMatchers("/") .permitAll() .antMatchers("/admin") .hasAuthority("ADMIN") .anyRequest() .authenticated() .and() .httpBasic(); }
Ancak spring 3.1 le buradaki bazı metodlar deprecated oldu. Öncelikle WebSecurityConfig classımızı artık WebSecurityConfigurerAdapter bu sınıftan türetmiyoruz. Çünkü bu sınıf tarihin tozlu sayfalarına gömülmüş durumda 🙂
İlk olarak nesnemizi şu şekilde güncellemeliyiz.
@Configuration @EnableWebSecurity public class WebSecurityConfiguration { // kodlar }
Burada gördüğünüz gibi hiç bir sınıftan extend olmasına gerek yok.
Configure metodumuzu da artık Bean anotasyonu ile ve SecurityFilterChain türünde oluşturmamız gerekiyor. authorizeRequests metoduda artık Lambda şeklinde kullanılıyor. antMatchers da deprecate oldu ve yerini requestMatchers metoduna bıraktı. Bu bilgilerden sonra configure metodumuzu spring boot 3.1 ye göre uyarlayalım.
@Bean SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception { http.authorizeHttpRequests((auth) -> auth .requestMatchers("/").permitAll() .requestMatchers("/admin/**").authenticated() ).formLogin(login -> login .loginPage("/login") .permitAll() ).logout(logout -> logout .logoutSuccessUrl("/login?logout") .permitAll() ); return http.build(); }
Aslında temel olarak basit bir config için yapmamız gerekenler bu kadar. Nesnemiz son olarak aşağıdaki gibi olmalıdır.
package com.emrtnm.example; import lombok.RequiredArgsConstructor; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.security.authentication.AuthenticationProvider; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; import org.springframework.security.web.SecurityFilterChain; @Configuration @EnableWebSecurity public class WebSecurityConfiguration { @Bean SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception { http.authorizeHttpRequests((auth) -> auth .requestMatchers("/").permitAll() .requestMatchers("/admin/**").authenticated() ).formLogin(login -> login .loginPage("/login") .permitAll() ).logout(logout -> logout .logoutSuccessUrl("/login?logout") .permitAll() ); return http.build(); } }
Tabii ki burada basit bir örnekle konuyu anlatmaya çalıştık. Bir kaç değişiklik daha yapalım. Örneğin bir authenticationProvider tanımlamak istersek yine Bean anotasyonu kullanarak bu konuyu çözüyoruz.
@Bean AuthenticationProvider authenticationProvider() { DaoAuthenticationProvider provider = new DaoAuthenticationProvider(); provider.setUserDetailsService(userDetailsService); provider.setPasswordEncoder(new BCryptPasswordEncoder()); return provider; }
authenticationProvider’ımızı tanımladıktan sonra configure metodumuzda bir değişiklik yapmamıza gerek yok. Birde isterseniz session management ekleyelim.
http.authorizeHttpRequests((auth) -> auth .requestMatchers("/").permitAll() .requestMatchers("/admin/**").authenticated() ).formLogin(login -> login .loginPage("/login") .permitAll() ).logout(logout -> logout .logoutSuccessUrl("/login?logout") .permitAll() ).sessionManagement(session -> session.sessionCreationPolicy(SessionCreationPolicy.STATELESS)); return http.build();
Kodlarımızın en son hali aşağıdaki gibi olmalıdır.
package com.emrtnm.example; import lombok.RequiredArgsConstructor; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.security.authentication.AuthenticationProvider; import org.springframework.security.authentication.dao.DaoAuthenticationProvider; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; import org.springframework.security.config.http.SessionCreationPolicy; import org.springframework.security.core.userdetails.UserDetailsService; import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; import org.springframework.security.web.SecurityFilterChain; @Configuration @EnableWebSecurity @RequiredArgsConstructor public class WebSecurityConfiguration { private final UserDetailsService userDetailsService; @Bean AuthenticationProvider authenticationProvider() { DaoAuthenticationProvider provider = new DaoAuthenticationProvider(); provider.setUserDetailsService(userDetailsService); provider.setPasswordEncoder(new BCryptPasswordEncoder()); return provider; } @Bean SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception { http.authorizeHttpRequests((auth) -> auth .requestMatchers("/").permitAll() .requestMatchers("/admin/**").authenticated() ).formLogin(login -> login .loginPage("/login") .permitAll() ).logout(logout -> logout .logoutSuccessUrl("/login?logout") .permitAll() ).sessionManagement(session -> session.sessionCreationPolicy(SessionCreationPolicy.STATELESS)); return http.build(); } }
Umarım faydalı olmuştur. Bir sonraki yazımızda görüşmek üzere. İyi çalışmalar.
İlk Yorumu Siz Yapın