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 {...}
Şeklen şöyle
Örnek
Şöyle yaparız
@Configuration@EnableWebSecurity(debug=true)public class MultipleSecurityCofig extends WebSecurityConfigurerAdapter {@Order(1)@Configurationpublic static class EmployeeConfig extends WebSecurityConfigurerAdapter{@Overrideprotected 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)@Configurationpublic static class ManagerConfig extends WebSecurityConfigurerAdapter{@Overrideprotected 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);@Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)throws IOException, ServletException {log.info("Manager Login Detected at {} ",Instant.now());chain.doFilter(request, response);}@Overridepublic void init(FilterConfig filterconfig) throws ServletException {}@Overridepublic void destroy() {}}
Hiç yorum yok:
Yorum Gönder