17 Eylül 2021 Cuma

SpringSecurity WebSecurityConfigurerAdapter Çoklu Realm

Giriş
Çoklu realm neden gerekir? Çünkü farklı url adreslerine farklı doğrulama yöntemleri uygulamak isteyebiliriz.

Normalde WebSecurityConfigurerAdapter bir tane realm'e denk gelir. Eğer farklı adresler/servisler için farklı authentication mekanizması kullanmak istiyorsak, bu sınıftan bir kaç tane yaratmak gerekebilir. Bu yöntemde farklı realm'lerin AuthenticationProvider'ları birbirlerini görmezler

Genel Kullanım
WebSecurityConfigurerAdapter sınıfından birden fazla yaratacağımız için @Orderer ile birlikte kullanmak gerekir
Şöyle yaparız
@Configuration
@EnableWebSecurity
@Order(1)
public class FooSecurityConfiguration extends WebSecurityConfigurerAdapter {
  ...
}
Bir örnek burada. Bir başka örnek burada

Şeklen şöyle

Örnek
Şöyle yaparız
@Configuration
@EnableWebSecurity(debug=true)
public class MultipleSecurityCofig extends WebSecurityConfigurerAdapter {
  @Order(1)
  @Configuration
  public  static class EmployeeConfig extends WebSecurityConfigurerAdapter{
    @Override
    protected void configure(HttpSecurity http) throws Exception {
      http.antMatcher("/api/v1/employee/**").authorizeRequests()
.antMatchers("/api/v1/employee/**").permitAll()
        .and().sessionManagement().disable()
        .cors().disable()
        .csrf().disable()
        .logout().disable()
        .requestCache().disable()
        .headers().disable();
    }
  }

  @Order(2)
  @Configuration
  public static class ManagerConfig extends WebSecurityConfigurerAdapter{
    @Override
    protected void configure(HttpSecurity http) throws Exception {
      http.antMatcher("/api/v1/manager/**").authorizeRequests()
.antMatchers("/api/v1/manager/**").permitAll()
        .and().addFilterAfter(new AuditLogFilter(), FilterSecurityInterceptor.class);
    }
  }
}
Manager için takılan filtre şöyledir
public class AuditLogFilter implements Filter {
  public static final Logger log = LoggerFactory.getLogger(AuditLogFilter.class);

  @Override
  public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
  throws IOException, ServletException {
    log.info("Manager Login Detected at {} ",Instant.now());
    chain.doFilter(request, response);
  }
  @Override
  public void init(FilterConfig filterconfig) throws ServletException {
  }

  @Override
  public void destroy() {
  }
}


Hiç yorum yok:

Yorum Gönder