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

我在jsf应用程序中实现了spring security。 除静态资源需要身份validation外,一切正常。 这是我的配置

@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资源标签。

   

我找到了类似的注释并为此添加了一个配置类

 @Configuration @EnableWebMvc public class WebMvcConfig extends WebMvcConfigurerAdapter { // equivalents for  tags @Override public void addResourceHandlers(ResourceHandlerRegistry registry) { registry.addResourceHandler("/resources/**").addResourceLocations("/resources/").setCachePeriod(31556926); } // equivalent for  tag @Override public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) { configurer.enable(); } } 

但静态资源仍需要身份validation。 如何使这项工作有一些帮助。

注意:我的资源放在/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/**请求匹配的响应添加一个标头/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资源库以及如何使用它?