ValentinD
ValentinD

Reputation: 153

Spring Security Thymleaf static resources don't load

I'm using SpringMVC with Thymleaf and Spring-Security. I want to load a page using Thymleaf template and I can load my static resources.

I want to load for example a picture located in : static/img/theme/logo.png from template.html

Here is what I have : result


template.html :

<body>
    <div layout:fragment="content">
                
        <a href="">img src="../static/img/theme/logo.png" alt="Logo"></a>
                                                        
        <h1>Hello</h1>
                  
    </div>
        
</body>

MvcConfig.java

@Configuration
public class MvcConfig extends WebMvcConfigurerAdapter {

    @Override
    public void addViewControllers(ViewControllerRegistry registry) {
        registry.addViewController("/home").setViewName("home");
        registry.addViewController("/index").setViewName("index");
        registry.addViewController("/template").setViewName("template");
        registry.addViewController("/layout").setViewName("layout");
        registry.addViewController("/login").setViewName("login");
        
    }
    
   
    
    @Override
    public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
        configurer.enable();
    }
  
  
}

WebSecurityConfig :

@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
    
    
    //List of all free pages
    
    private static final String[] pagesFree = {
            "/home",
            "/template",
            "/layout",
            
            //Thymleaf directory
            "/css/**",
            "/js/**",
            "/img/**",
            "/fonts/**",
            "/ico/**",
            "/twitter/**",
            "/"
            };
    
    
    
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        
        
        
        http
            .authorizeRequests()
                .antMatchers(pagesFree).permitAll()
                .anyRequest().authenticated()
                .and()
            .formLogin()
                .loginPage("/login")
                .permitAll()
                .and()
            .logout()
                .permitAll();
    }

    @Autowired
    public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
        auth.inMemoryAuthentication()
                .withUser("u").password("u").roles("USER");
    }
    
  
}

Source Code tree

Upvotes: 1

Views: 1808

Answers (1)

Marco Tedone
Marco Tedone

Reputation: 602

In your security configuration you would declare something like this:

/** Public URLs. */
private static final String[] PUBLIC_MATCHERS = {
        "/webjars/**",
        "/css/**",
        "/js/**",
        "/images/**",
        "/"
};

Then something like this:

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

    List<String> activeProfiles = Arrays.asList(env.getActiveProfiles());
    if (activeProfiles.contains("dev")) {
        http.csrf().disable();
        http.headers().frameOptions().disable();
    }

    http
            .authorizeRequests()
            .antMatchers(PUBLIC_MATCHERS).permitAll()
            .anyRequest().authenticated()
            .and()
            .formLogin().loginPage("/login").defaultSuccessUrl("/payload")
            .failureUrl("/login?error").permitAll()
            .and()
            .logout().permitAll();
}

And in your Thymeleaf template you'd declare something like this:

<img class="featurette-image pull-left" th:src="@{/images/browser-icon-firefox.png}" />

A working copy of your project can be found here.

Upvotes: 2

Related Questions