2014-06-05 27 views
6

Ich versuche Spring Security in meinem Spring-Boot-Projekt zu verwenden.Spring-Boot & Spring-Security-Konfiguration

Meine Projektstruktur ist:

/project 
-/src/main 
-- /java 
--/resources 
--- /static 
    ---- /css 
    ---- /fonts 
    ---- /libs 
--- /templates 
    ---- /all html files 

Hier meine gradle Einstellungen ist:

apply plugin: 'java' 
apply plugin: 'groovy' 
apply plugin: 'idea' 
apply plugin: 'spring-boot' 
apply plugin: 'jacoco' 
apply plugin: 'war' 
apply plugin: 'maven' 

project.ext { 
    springBootVersion = '1.0.2.RELEASE' 
} 

dependencies { 
    compile("org.springframework.boot:spring-boot-starter-web:$springBootVersion") 
    compile("org.springframework.boot:spring-boot:1.0.1.RELEASE") 
    compile("org.springframework.boot:spring-boot-starter-thymeleaf") 
    compile("org.springframework.boot:spring-boot-starter-data-jpa:$springBootVersion") 
    compile("org.springframework.security:spring-security-web:4.0.0.M1") 
    compile("org.springframework.security:spring-security-config:4.0.0.M1") 
... 
} 

Jeder meiner HTML-Dateien hat dies:

<head> 
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> 
    <meta name="viewport" content="width=device-width, initial-scale=1.0"/> 
    <meta name="description" content=""/> 

    <link href="/css/bootstrap.css" rel="stylesheet"/> 
    <link href="/css/bootstrap.min.css" rel="stylesheet"/> 
    <link href="/css/bootstrap-responsive.css" rel="stylesheet"/> 
    <link href="/css/bootstrap-responsive.min.css" rel="stylesheet"/> 
    <link href="/css/ofac.css" rel="stylesheet"/> 
    <link href="//netdna.bootstrapcdn.com/font-awesome/4.0.3/css/font-awesome.css" rel="stylesheet"/> 

    <!-- HTML5 shim, for IE6-8 support of HTML5 elements --> 
    <!--[if lt IE 9]> 
    <script src="http://html5shim.googlecode.com/svn/trunk/html5.js"></script> 
    <![endif]--> 
</head> 

Hier ist meine MVC Config: @Configuration Öffentliche Klasse MvcConfig erweitert WebMvcConfigurerAd Apter {

@Override 
    public void addViewControllers(ViewControllerRegistry registry) { 
     registry.addViewController("/home").setViewName("index"); 
     registry.addViewController("/").setViewName("index"); 
     registry.addViewController("/about").setViewName("about"); 
     registry.addViewController("/login").setViewName("login"); 
     registry.addViewController("/upload").setViewName("upload"); 
     registry.addViewController("/status").setViewName("status"); 
     registry.addViewController("/search").setViewName("search"); 
    } 

    @Override 
    public void addInterceptors(InterceptorRegistry registry) { 
     LocaleChangeInterceptor localeChangeInterceptor = new LocaleChangeInterceptor(); 
     localeChangeInterceptor.setParamName("lang"); 
     registry.addInterceptor(localeChangeInterceptor); 
    } 

    @Bean 
    public LocaleResolver localeResolver() { 
     CookieLocaleResolver cookieLocaleResolver = new CookieLocaleResolver(); 
     cookieLocaleResolver.setDefaultLocale(StringUtils.parseLocaleString("en")); 
     return cookieLocaleResolver; 
    } 

    @Bean 
    public MessageSource messageSource() { 
     ReloadableResourceBundleMessageSource messageSource = new ReloadableResourceBundleMessageSource(); 
     messageSource.setBasenames("classpath:messages/messages", "classpath:messages/validation"); 
     // if true, the key of the message will be displayed if the key is not 
     // found, instead of throwing a NoSuchMessageException 
     messageSource.setUseCodeAsDefaultMessage(true); 
     messageSource.setDefaultEncoding("UTF-8"); 
     // # -1 : never reload, 0 always reload 
     messageSource.setCacheSeconds(0); 
     return messageSource; 
    } 

Basierend auf verschiedenen Beispielen fand ich online, ich habe die folgende Sicherheitskonfiguration:

@Configuration 
@EnableWebMvcSecurity 
@EnableGlobalMethodSecurity(prePostEnabled = true) 
public class SecurityConfig extends WebSecurityConfigurerAdapter { 

    @Autowired 
    private DataSource datasource; 

    @Override 
    protected void configure(HttpSecurity http) throws Exception { 

     http 
       .authorizeRequests() 
       .antMatchers("/resources/**").permitAll(); 

     http 
       .formLogin().failureUrl("/login?error") 
       .defaultSuccessUrl("/") 
       .loginPage("/login") 
       .permitAll() 
       .and() 
       .logout().logoutRequestMatcher(new AntPathRequestMatcher("/logout")).logoutSuccessUrl("/login") 
       .permitAll(); 

     http 
       .authorizeRequests().anyRequest().authenticated(); 
    } 

    @Override 
    protected void configure(AuthenticationManagerBuilder auth) throws Exception { 
     JdbcUserDetailsManager userDetailsService = new JdbcUserDetailsManager(); 
     userDetailsService.setDataSource(datasource); 
     PasswordEncoder encoder = new BCryptPasswordEncoder(); 

     auth.userDetailsService(userDetailsService).passwordEncoder(encoder); 
     auth.jdbcAuthentication().dataSource(datasource); 

     if (!userDetailsService.userExists("user")) { 
      List<GrantedAuthority> authorities = new ArrayList<GrantedAuthority>(); 
      authorities.add(new SimpleGrantedAuthority("USER")); 
      User userDetails = new User("user", encoder.encode("password"), authorities); 

      userDetailsService.createUser(userDetails); 
     } 
    } 
} 

Als ich localhost:9001 navigiere ich bin mit meiner Login-Seite aufgefordert. Ich stelle die korrekten Zugangsdaten zur Verfügung und werde zur URL umgeleitet: http://localhost:9001/css/ofac.css der Inhalt meiner css Akte wird gezeigt. Bevor ich die Sicherheit hinzugefügt habe, wurden die Seiten korrekt gerendert. Sobald die Anmeldung erfolgreich ist, wird die CSS angezeigt, aber wenn ich die Wurzel zurück zu "/" navigiere, verhält sich alles wie es sollte.

Kann jemand sehen, was ich hier falsch mache?

aktualisieren: entfernte ich folgende weil Frühling-Boot wird die/Ressourcen umgehen/**

http 
        .authorizeRequests() 
        .antMatchers("/resources/**").permitAll(); 

Ich habe auch die Umleitung für eine erfolgreiche Anmeldung an:

.defaultSuccessUrl("/home")  

weil Das ist auch auf "/"

zugeordnet. Das Verhalten ist jedoch das gleiche. Ein interessantes Verhalten ist, dass, wenn ich Safari verwenden, wird der Login geben Sie mir „http://localhost:9001/css/bootstrap.css“ aber Firefox gibt mir „http://localhost:9001/css/bootstrap-responsive.min.css

Wenn ich inspizieren die POST http://localhost:9001/login mit Firebug ich ein „302 Found“, gefolgt erhalten durch eine GET http://localhost:9001/css/bootstrap-responsive.min.css, die zurückgibt ein 200

+1

'/ css' ist geschützt, sobald eine Anfrage für diese URL angezeigt wird, wird nach dem Login ein Login angezeigt, und Sie werden zu der URL weitergeleitet, die die Anmeldung ausgelöst hat. Ich würde erwarten, dass Ihr CSS unter '/ resources/** verfügbar wäre, ansonsten schließen Sie'/css/** 'mit einem' allowAll() 'ein. –

+0

Meine/CSS-Dateien sind unter/Ressourcen (aktualisiert ursprünglichen Beitrag, um dies zu zeigen), so glaube ich, dass es mit meinem "ausgesetzt sein würde.authorizeRequests() .antMatchers ("/ resources/**") .permitAll(); " – sonoerin

+0

Anscheinend fragt etwas eine CSS nicht aus diesem Verzeichnis überprüfen Sie Ihre Vorlagen. –

Antwort

6

diese Methode aus dem/static/fonts/Pfad

@Override 
public void configure(WebSecurity security){ 
    security.ignoring().antMatchers("/css/**","/fonts/**","/libs/**""); 
} 
+1

Scheint wie Spring Boot Security nur Auth für '/ css/**', '/ images/**' und '/ js/**' zu ignorieren. Ich musste den '/ fonts/**' Eintrag manuell hinzufügen. –

+0

Ja, ich musste das ähnlich machen (css, js waren in Ordnung, aber keine Schriftarten) ... .antMatchers ("/", "/ login **", "/ webjars/**", "/ fonts/* *). permitAll() –

+0

Wie können wir diese Pfade in Interceptor ignorieren? obwohl ich excludePathpattern ("/ css") verwende, um statische Inhaltspfade zu ignorieren –

0

ich auch erlebt Spring Security blockiert Ressourcen SecurityConfig hinzuzufügen. "/ Static/css", "/ static/js", "/ static/images" waren jedoch standardmäßig erlaubt, aber/static/fonts/** wurde blockiert.

Unten ist ein Beispiel, wie ich das behoben habe.