使用Spring Security使JSF资源可以公开访问



我已经在jsf应用程序中实现了spring安全性。一切正常,只是静态资源需要身份验证。这是我的配置

@Override
protected void configure(HttpSecurity http) throws Exception {
    http.csrf().disable();
    http.authorizeRequests()
            .antMatchers("/register", "/resources/**").permitAll()
            .anyRequest().authenticated()
            .and().formLogin().loginPage("/login").permitAll()
           .usernameParameter("username").passwordParameter("password")
            .and().exceptionHandling().accessDeniedPage("/Access_Denied");
}

在做了一些谷歌搜索后,大多数解决方案是添加mvc资源标签。

  <mvc:resources mapping="/resources/**" location="/resources/"
    cache-period="31556926"/>

我发现了类似的注释,并为这个

添加了一个配置类
@Configuration
@EnableWebMvc
public class WebMvcConfig extends WebMvcConfigurerAdapter {
    // equivalents for <mvc:resources/> tags
    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/resources/**").addResourceLocations("/resources/").setCachePeriod(31556926);
    }
    // equivalent for <mvc:default-servlet-handler/> tag
    @Override
    public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
        configurer.enable();
    }
}

但是静态资源仍然需要身份验证。如果能给我一些帮助就更好了。

注:我的资源放在/src/main/webapp/resources/{css|js|image}。问题是,如果用户没有登录,css, js的效果不显示在登录页面。用户登录一次后,登录后进入登录页面,出现css效果

JSF管理的库资源是从/javax.faces.resource/**路径提供的。所以你需要让这个路径可以公开访问:

@Override
protected void configure(HttpSecurity http) throws Exception {
    http.csrf().disable();
    http.authorizeRequests()
        .antMatchers("/register", "/javax.faces.resource/**").permitAll()
        .antMatchers("/**").authenticated()
        .and().formLogin().loginPage("/login").permitAll()
        .usernameParameter("username").passwordParameter("password")
        .and().exceptionHandling().accessDeniedPage("/Access_Denied");
}

您可能还希望这些资源被浏览器缓存。然后,将这一部分添加到您的配置中,它为每个匹配/javax.faces.resource/**请求的响应添加一个头写入器:

http.headers()
        .addHeaderWriter(new DelegatingRequestMatcherHeaderWriter(
                new AntPathRequestMatcher("/javax.faces.resource/**"),
                new HeaderWriter() {
                    @Override
                    public void writeHeaders(HttpServletRequest request,
                            HttpServletResponse response) {
                        response.addHeader("Cache-Control", "private, max-age=86400");
                    }
                }))
        .defaultsDisabled();

参见:

    JSF资源库是用来做什么的?应该如何使用它?

最新更新