İçeriğe geç

Spring Security 2.7 den Spring Boot 3.1 Yükseltme

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.

Kategori:JAVA

İlk Yorumu Siz Yapın

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir