使用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();

以上是 使用Spring Security公开访问JSF资源 的全部内容, 来源链接: utcz.com/qa/402273.html

回到顶部