2016-04-28 4 views
0

Ich habe zwei Konfigurationen. Der erste möchte erreichen, dass alle Anfragen von (/ api/**) nur von einer bestimmten IP kommen müssen.Spring Security Java Config - dynamische IP-Liste für eine Anfrage URL

wie folgend ...

.authorizeRequests().antMatchers("/api/**").hasIpAddress("dynamic List of IPs"); 

Es soll geprüft werden, ob die IP in der Datenbank gespeichert sind, sonst ist der Zugriff verweigert werden.

Und die secound-Konfiguration kümmert sich um den Rest.

@EnableWebSecurity 

public class AppSecurityConfig { 

@Autowired 
protected void configure(AuthenticationManagerBuilder auth) throws Exception { 
    auth.userDetailsService(new CustomUserDetailsService()).passwordEncoder(new Md5PasswordEncoder()); 

} 

@Configuration 
@Order(1) 
public static class ApiWebSecurityConfigurationAdapter extends WebSecurityConfigurerAdapter { 

    @Override 
    protected void configure(HttpSecurity http) throws Exception { 
     http 
       .csrf().disable() 
       .headers().disable() 
       .authorizeRequests().antMatchers("/api/**").hasIpAddress("dynamic List of IPs"); 
    } 
} 

@Configuration 
public static class FormLoginWebSecurityConfigurerAdapter extends WebSecurityConfigurerAdapter { 

    @Override 
    protected void configure(HttpSecurity http) throws Exception { 
     http.sessionManagement().maximumSessions(1) 
       .expiredUrl("/error/expired.xhtml").and() 
       .invalidSessionUrl("/Anmeldung.xhtml?check=invalid"); 
     http 
       .csrf().disable() 
       .headers().disable() 
       .formLogin().loginPage("/Anmeldung/").loginProcessingUrl("/j_spring_security_check").successHandler(new CustomAuthenticationSuccessHandler()) 
       .failureUrl("/Anmeldung.xhtml?check=error").usernameParameter("j_username").passwordParameter("j_password") 
       .and() 
       .exceptionHandling().accessDeniedPage("/error/403.xhtml") 
       .and() 
       .logout().logoutUrl("/logout").logoutSuccessUrl("/Anmeldung.xhtml?check=logout").invalidateHttpSession(false).deleteCookies("JSESSIONID").permitAll(); 

     ExpressionUrlAuthorizationConfigurer<HttpSecurity>.ExpressionInterceptUrlRegistry interceptUrlRegistry = http.authorizeRequests(); 
     interceptUrlRegistry.antMatchers("/Administrator/*").hasAnyAuthority("ROLE_ADMIN"); 
     interceptUrlRegistry.antMatchers("/*").hasAnyAuthority("ROLE_USER"); 
     interceptUrlRegistry.antMatchers("/Anmeldung/index.xhtml").anonymous(); 
     interceptUrlRegistry.antMatchers("/template/*").denyAll(); 
     interceptUrlRegistry.antMatchers("/resources/**").permitAll(); 
    } 
} 
} 

Danke für Ihre Hilfe.

+0

Hier ist eine nette Diskussion, wenn seine Subnetze http://forum.spring.io/forum/spring-projects/security/95303-how-to-use-hasipaddress – HRgiger

+0

Hey, danke für den Link, aber ich denke ich brauche einen Filter oder ähnliches. So kann ich nach jeder Anfrage (/ api/**) überprüfen, ob die IP-Adresse der Anfrage in der Datenbank ist. – Sascha

+0

so? http://stackoverflow.com/questions/28303097/spring-security-multiple-hasipaddress-antmatchers – HRgiger

Antwort

0

Sie können das httsecurity-Objekt innerhalb von for loop wie den unten angegebenen Code dynamisch konfigurieren.

for (Entry<String, String> entry : hasmapObject) { 
       String url = entry.getKey().trim(); 
       String ips= entry.getValue().trim(); 
    http.authorizeRequests().and().authorizeRequests().antMatchers(url).hasIpAddress(ips); 
      } 

Das funktionierte für mich. Das hashmap-Objekt hatte die dynamische Liste der URLs und ihrer entsprechenden ips, um den Zugriff zu ermöglichen.

"http.authorizeRequests(). And()" Dies und() wird benötigt, um einzurücken, wie wir in XML-Konfiguration verwenden, um http untergeordnete Elemente in XML zu konfigurieren.

Bitte lassen Sie mich wissen, wenn dies hilft.