2016-08-22 10 views
0

jsfアプリケーションでスプリングセキュリティを実装しました。静的リソースが認証を必要とする場合を除き、すべてが正常に動作しています。これは私の設定ですSpringセキュリティでJSFリソースを公開するようにする

@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効果が表示されます。

答えて

1

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

も参照してください:

+0

私は "/javax.faces.resource/**"を追加しました。残念ながら、これによりサイト全体がログインしていないユーザーに許可されます。誰もがログインせずにすべてにアクセスできます。 –

+0

はい!私は "/javax.faces.resource/**"を数回試しましたが、この.antMatchers( "/ **")を忘れました。毎回認証されました。 –

関連する問題