20 Temel Spring Security Senaryosu: Kod Örnekleriyle Kapsamlı Güvenlik Çözümleri

 


  1. Temel Form Tabanlı Kimlik Doğrulama

Bu senaryo, kullanıcıların kullanıcı adı ve şifre ile oturum açmasını sağlar.

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .authorizeRequests()
                .anyRequest().authenticated()
                .and()
            .formLogin()
                .loginPage("/login")
                .permitAll();
    }
}
  1. Rol Tabanlı Yetkilendirme

Farklı rollere sahip kullanıcılar için farklı erişim hakları tanımlar.

@Override
protected void configure(HttpSecurity http) throws Exception {
    http
        .authorizeRequests()
            .antMatchers("/admin/**").hasRole("ADMIN")
            .antMatchers("/user/**").hasAnyRole("USER", "ADMIN")
            .anyRequest().authenticated()
            .and()
        .formLogin();
}
  1. JWT (JSON Web Token) Kimlik Doğrulama

Stateless kimlik doğrulama için JWT kullanımı.

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Autowired
    private JwtTokenProvider jwtTokenProvider;

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .csrf().disable()
            .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)
            .and()
            .authorizeRequests()
                .anyRequest().authenticated()
            .and()
            .apply(new JwtConfigurer(jwtTokenProvider));
    }
}
  1. OAuth2 ile Sosyal Medya Girişi

Google, Facebook gibi sosyal medya hesaplarıyla giriş yapma imkanı sunar.

@Configuration
@EnableWebSecurity
public class OAuth2LoginConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .authorizeRequests()
                .anyRequest().authenticated()
                .and()
            .oauth2Login();
    }
}
  1. Remember Me Fonksiyonu

Kullanıcının oturumunu hatırlama özelliği ekler.

@Override
protected void configure(HttpSecurity http) throws Exception {
    http
        .authorizeRequests()
            .anyRequest().authenticated()
            .and()
        .formLogin()
            .and()
        .rememberMe()
            .key("uniqueAndSecret")
            .tokenValiditySeconds(86400);
}
  1. CSRF (Cross-Site Request Forgery) Koruması

CSRF saldırılarına karşı koruma sağlar.

@Override
protected void configure(HttpSecurity http) throws Exception {
    http
        .csrf()
            .csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse());
}
  1. CORS (Cross-Origin Resource Sharing) Yapılandırması

Farklı kaynaklardan gelen isteklere izin verir.

@Bean
public CorsConfigurationSource corsConfigurationSource() {
    CorsConfiguration configuration = new CorsConfiguration();
    configuration.setAllowedOrigins(Arrays.asList("https://example.com"));
    configuration.setAllowedMethods(Arrays.asList("GET", "POST", "PUT", "DELETE"));
    UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
    source.registerCorsConfiguration("/**", configuration);
    return source;
}

@Override
protected void configure(HttpSecurity http) throws Exception {
    http.cors();
}
  1. Özel Kimlik Doğrulama Sağlayıcısı

Özel bir kimlik doğrulama mantığı uygulamak için.

@Configuration
public class CustomAuthenticationProvider implements AuthenticationProvider {

    @Override
    public Authentication authenticate(Authentication authentication) throws AuthenticationException {
        String username = authentication.getName();
        String password = authentication.getCredentials().toString();
        
        // Özel kimlik doğrulama mantığı burada
        
        return new UsernamePasswordAuthenticationToken(username, password, new ArrayList<>());
    }

    @Override
    public boolean supports(Class<?> authentication) {
        return authentication.equals(UsernamePasswordAuthenticationToken.class);
    }
}

@Autowired
public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
    auth.authenticationProvider(new CustomAuthenticationProvider());
}
  1. Method Düzeyinde Güvenlik

Belirli metotlara erişimi kısıtlar.

@Configuration
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class MethodSecurityConfig extends GlobalMethodSecurityConfiguration {
}

@Service
public class UserService {
    @PreAuthorize("hasRole('ADMIN')")
    public void deleteUser(Long userId) {
        // Kullanıcı silme işlemi
    }
}
  1. Şifreleme ve Şifre Karması

Kullanıcı şifrelerini güvenli bir şekilde saklamak için.

@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Bean
    public PasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
    }

    @Autowired
    public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
        auth.userDetailsService(userDetailsService).passwordEncoder(passwordEncoder());
    }
}
  1. Session Fixation Koruması

Oturum sabitleme saldırılarına karşı koruma sağlar.

@Override
protected void configure(HttpSecurity http) throws Exception {
    http
        .sessionManagement()
            .sessionFixation().migrateSession()
        .and()
        .authorizeRequests()
            .anyRequest().authenticated()
        .and()
        .formLogin();
}
  1. Brute Force Saldırı Koruması

Başarısız giriş denemelerini sınırlandırarak brute force saldırılarını engeller.

@Bean
public DaoAuthenticationProvider authenticationProvider() {
    DaoAuthenticationProvider authProvider = new DaoAuthenticationProvider();
    authProvider.setUserDetailsService(userDetailsService);
    authProvider.setPasswordEncoder(passwordEncoder());
    authProvider.setPreAuthenticationChecks(new AccountStatusUserDetailsChecker() {
        @Override
        public void check(UserDetails user) {
            super.check(user);
            if (user instanceof LockableUser && ((LockableUser) user).isTemporarilyLocked()) {
                throw new LockedException("Account is temporarily locked");
            }
        }
    });
    return authProvider;
}

// LockableUser sınıfı ve ilgili servis uygulamaları gereklidir
  1. SSL/TLS Zorunluluğu

HTTPS kullanımını zorunlu kılar.

@Override
protected void configure(HttpSecurity http) throws Exception {
    http
        .requiresChannel()
            .anyRequest().requiresSecure()
        .and()
        .authorizeRequests()
            .anyRequest().authenticated()
        .and()
        .formLogin();
}
  1. IP Tabanlı Erişim Kontrolü

Belirli IP adreslerine erişimi kısıtlar veya izin verir.

@Override
protected void configure(HttpSecurity http) throws Exception {
    http
        .authorizeRequests()
            .antMatchers("/admin/**").hasIpAddress("192.168.1.0/24")
            .anyRequest().authenticated()
        .and()
        .formLogin();
}
  1. İki Faktörlü Kimlik Doğrulama (2FA)

Ek bir güvenlik katmanı olarak iki faktörlü kimlik doğrulama ekler.

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Autowired
    private TwoFactorAuthenticationProvider twoFactorAuthenticationProvider;

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .authorizeRequests()
                .anyRequest().authenticated()
            .and()
            .formLogin()
            .and()
            .addFilterBefore(new TwoFactorAuthenticationFilter(), UsernamePasswordAuthenticationFilter.class);
    }

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.authenticationProvider(twoFactorAuthenticationProvider);
    }
}

// TwoFactorAuthenticationProvider ve TwoFactorAuthenticationFilter sınıflarının uygulanması gerekir
  1. OAuth2 Resource Server

Bir OAuth2 kaynak sunucusu olarak davranır.

@Configuration
@EnableResourceServer
public class ResourceServerConfig extends ResourceServerConfigurerAdapter {

    @Override
    public void configure(HttpSecurity http) throws Exception {
        http
            .authorizeRequests()
                .antMatchers("/api/**").authenticated()
            .and()
            .oauth2ResourceServer()
                .jwt();
    }
}
  1. Şüpheli Aktivite Loglama

Güvenlik olaylarını loglamak için özel bir filtre ekler.

public class SecurityLoggingFilter extends GenericFilterBean {

    private static final Logger logger = LoggerFactory.getLogger(SecurityLoggingFilter.class);

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {
        HttpServletRequest httpRequest = (HttpServletRequest) request;
        
        logger.info("Request from IP: " + httpRequest.getRemoteAddr() + 
                    " to URL: " + httpRequest.getRequestURL());
        
        chain.doFilter(request, response);
    }
}

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .addFilterBefore(new SecurityLoggingFilter(), UsernamePasswordAuthenticationFilter.class)
            // ... diğer konfigürasyonlar
    }
}
  1. Özel Yetkilendirme Kuralları

Karmaşık yetkilendirme senaryoları için özel bir AccessDecisionVoter uygulaması.

public class CustomAccessDecisionVoter implements AccessDecisionVoter<Object> {

    @Override
    public boolean supports(ConfigAttribute attribute) {
        return true;
    }

    @Override
    public boolean supports(Class<?> clazz) {
        return true;
    }

    @Override
    public int vote(Authentication authentication, Object object, Collection<ConfigAttribute> attributes) {
        // Özel yetkilendirme mantığı burada
        return ACCESS_GRANTED;
    }
}

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .authorizeRequests()
                .anyRequest().authenticated()
            .accessDecisionManager(accessDecisionManager());
    }

    @Bean
    public AccessDecisionManager accessDecisionManager() {
        List<AccessDecisionVoter<?>> decisionVoters = Arrays.asList(
            new WebExpressionVoter(),
            new RoleVoter(),
            new AuthenticatedVoter(),
            new CustomAccessDecisionVoter()
        );
        return new UnanimousBased(decisionVoters);
    }
}
  1. Asenkron Metot Güvenliği

Asenkron metotlar için güvenlik kuralları uygular.

@Configuration
@EnableGlobalMethodSecurity(prePostEnabled = true, proxyTargetClass = true)
@EnableAsync
public class MethodSecurityConfig extends AsyncConfigurerSupport {

    @Override
    public Executor getAsyncExecutor() {
        return new DelegatingSecurityContextExecutorService(Executors.newFixedThreadPool(5));
    }
}

@Service
public class AsyncService {

    @Async
    @PreAuthorize("hasRole('ADMIN')")
    public CompletableFuture<String> performAsyncTask() {
        // Asenkron işlem
        return CompletableFuture.completedFuture("Task completed");
    }
}
  1. Özel Login Sayfası

Özelleştirilmiş bir login sayfası kullanır.

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .authorizeRequests()
                .anyRequest().authenticated()
            .and()
            .formLogin()
                .loginPage("/custom-login")
                .loginProcessingUrl("/perform_login")
                .defaultSuccessUrl("/homepage", true)
                .failureUrl("/custom-login?error=true")
                .permitAll()
            .and()
            .logout()
                .logoutSuccessUrl("/custom-login?logout=true")
                .permitAll();
    }
}


Please Select Embedded Mode To Show The Comment System.*

Daha yeni Daha eski

نموذج الاتصال