web-dev-qa-db-ja.com

Spring BootおよびSpring Securityアプリケーションで静的Webリソースを提供する

Spring Boot Webアプリケーションを開発し、SpringセキュリティJava構成を使用してセキュリティを保護しようとしています。

アドバイスされているように、静的なWebリソースを 'src/main/resources/public'に配置した後 ここでSpringブログで 、私は静的リソースを取得できます。つまり、ブラウザでhttps://localhost/test.htmlを押すと、htmlコンテンツが提供されます。

問題

Spring Securityを有効にした後、静的リソースURLにアクセスするには認証が必要です。

私の関連するSpring Security Java configは次のようになります。

@Override
    protected void configure(HttpSecurity http) throws Exception {
        // @formatter:off
        http.
            authorizeRequests()
                .antMatchers("/","/public/**", "/resources/**","/resources/public/**")
                    .permitAll()
                .antMatchers("/google_oauth2_login").anonymous()
                    .anyRequest().authenticated()
                .and()
                .formLogin()
                    .loginPage("/")
                    .loginProcessingUrl("/login")
                    .defaultSuccessUrl("/home")
                    .and()
                    .csrf().disable()
                    .logout()
                        .logoutSuccessUrl("/")
                        .logoutUrl("/logout") // POST only
                .and()
                    .requiresChannel()
                    .anyRequest().requiresSecure()
                .and()
                    .addFilterAfter(oAuth2ClientContextFilter(),ExceptionTranslationFilter.class)
                    .addFilterAfter(googleOAuth2Filter(),OAuth2ClientContextFilter.class)
                .userDetailsService(userService);
        // @formatter:on
    }

Src/main/resources/public内に配置された静的リソースを許可するためにantMatchersを構成するにはどうすればよいですか?

61
Kumar Sambhav

知っておくべきことがいくつかあります。

  • Antマッチャーは、ファイルシステム上のリソースのパスではなく、リクエストパスと一致します。
  • src/main/resources/publicに配置されたリソースは、アプリケーションのルートから提供されます。たとえば、src/main/resources/public/hello.jpghttp://localhost:8080/hello.jpgから提供されます

これが、現在のマッチャー構成が静的リソースへのアクセスを許可していない理由です。 /resources/**が機能するには、リソースをsrc/main/resources/public/resourcesに配置し、http://localhost:8080/resources/your-resourceでアクセスする必要があります。

Spring Bootを使用している場合、追加の構成を追加するのではなく、デフォルトを使用することを検討できます。デフォルトでは、Spring Bootは/css/**/js/**/images/**、および/**/favicon.icoへのアクセスを許可します。たとえば、src/main/resources/public/images/hello.jpgという名前のファイルを作成し、追加の構成を追加しなくても、http://localhost:8080/images/hello.jpgからログインしなくてもアクセスできます。これは、 Webメソッドセキュリティサンプル ここで、特別な設定なしでBootstrap CSSファイルへのアクセスが許可されます。

87
Andy Wilkinson
  @Override
      public void configure(WebSecurity web) throws Exception {
        web
          .ignoring()
             .antMatchers("/resources/**"); // #3
      }

「/ resources /」で始まるリクエストは無視します。これは、XML名前空間構成を使用する場合のhttp @ security = noneの構成に似ています。

27
RPaul

20時間以上の研究を経た究極のソリューションがここにあります。

ステップ1。プロジェクトに「MvcConfig.Java」を追加します。

import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;

@Configuration
public class MvcConfig extends WebMvcConfigurerAdapter {
    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry
                .addResourceHandler("/resources/**")
                .addResourceLocations("/resources/");
    }
}

ステップ2。 SecurityConfigクラスにconfigure(WebSecurity web)オーバーライドを追加します

@Override
    public void configure(WebSecurity web) throws Exception {
        web
                .ignoring()
                .antMatchers("/resources/**");
    }

ステップ3。すべての静的リソースをwebapp/resources /..に配置します

20
JasperJ

これは、回答(スプリングブート2の場合)と質問の両方の場合があります。春のセキュリティと組み合わせた春のブート2では、すべての(すべてのルート/アンマッチャーを意味する)がデフォルトで保護されているようです

WebSecurityConfigurerAdapter

個別のセキュリティメカニズムを使用しない場合、すべては以前と同じですか?

Andy Wilkinsonが上記の回答で述べているように、古いスプリングブートバージョン(1.5以下)では、public/** or static/**のような場所はデフォルトで許可されています。

したがって、この質問/回答をまとめると、スプリングセキュリティ付きスプリングブート2を使用しており、個別のセキュリティメカニズムがある場合、任意のルートに配置された静的コンテンツへのアクセスを排他的に許可する必要があります。そのようです:

@Configuration
public class SpringSecurityConfiguration extends WebSecurityConfigurerAdapter {

private final ThdAuthenticationProvider thdAuthenticationProvider;

private final ThdAuthenticationDetails thdAuthenticationDetails;

/**
 * Overloaded constructor.
 * Builds up the needed dependencies.
 *
 * @param thdAuthenticationProvider a given authentication provider
 * @param thdAuthenticationDetails  given authentication details
 */
@Autowired
public SpringSecurityConfiguration(@NonNull ThdAuthenticationProvider thdAuthenticationProvider,
                                   @NonNull ThdAuthenticationDetails thdAuthenticationDetails) {
    this.thdAuthenticationProvider = thdAuthenticationProvider;
    this.thdAuthenticationDetails = thdAuthenticationDetails;
}

/**
 * Creates the AuthenticationManager with the given values.
 *
 * @param auth the AuthenticationManagerBuilder
 */
@Autowired
public void configureGlobal(AuthenticationManagerBuilder auth) {

    auth.authenticationProvider(thdAuthenticationProvider);
}

/**
 * Configures the http Security.
 *
 * @param http HttpSecurity
 * @throws Exception a given exception
 */
@Override
protected void configure(HttpSecurity http) throws Exception {

    http.authorizeRequests()
            .requestMatchers(PathRequest.toStaticResources().atCommonLocations()).permitAll()
            .antMatchers("/management/**").hasAnyAuthority(Role.Role_Engineer.getValue(),
            Role.Role_Admin.getValue())
            .antMatchers("/settings/**").hasAnyAuthority(Role.Role_Engineer.getValue(),
            Role.Role_Admin.getValue())

            .anyRequest()
            .fullyAuthenticated()
            .and()
            .formLogin()
            .authenticationDetailsSource(thdAuthenticationDetails)
            .loginPage("/login").permitAll()
            .defaultSuccessUrl("/bundle/index", true)
            .failureUrl("/denied")
            .and()
            .logout()
            .invalidateHttpSession(true)
            .logoutSuccessUrl("/login")
            .logoutUrl("/logout")
            .and()
            .exceptionHandling()
            .accessDeniedHandler(new CustomAccessDeniedHandler());
}

}

次の新しいコード行に注意してください。

.requestMatchers(PathRequest.toStaticResources().atCommonLocations()).permitAll()

Spring Boot 1.5以前を使用する場合、これらの場所(static/public/webjarsなど)を明示的に許可する必要はありません。

以下は公式のメモです。新しいセキュリティフレームワークでは、それ自体の古いバージョンに関して何が変更されましたか。

Spring Boot 2.0 M4でのセキュリティの変更

これが誰かの助けになることを願っています。ありがとうございました!ごきげんよう!

15
Thomas Lang

Webjarを使用している場合。これをconfigureメソッドに追加する必要があります:http.authorizeRequests().antMatchers("/webjars/**").permitAll();

これが最初のステートメントであることを確認してください。例えば:

@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests().antMatchers("/webjars/**").permitAll();
        http.authorizeRequests().anyRequest().authenticated();
         http.formLogin()
         .loginPage("/login")
         .failureUrl("/login?error")
         .usernameParameter("email")
         .permitAll()
         .and()
         .logout()
         .logoutUrl("/logout")
         .deleteCookies("remember-me")
         .logoutSuccessUrl("/")
         .permitAll()
         .and()
         .rememberMe();
    }

Webjarを有効にするには、これも必要です。

@Configuration
    public class MvcConfig extends WebMvcConfigurerAdapter {
        ...
        @Override
        public void addResourceHandlers(ResourceHandlerRegistry registry) {
                registry.addResourceHandler("/webjars/**").addResourceLocations("classpath:/META-INF/resources/webjars/");
        }
        ...
    }
8
ACV
@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

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

        String[] resources = new String[]{
                "/", "/home","/pictureCheckCode","/include/**",
                "/css/**","/icons/**","/images/**","/js/**","/layer/**"
        };

        http.authorizeRequests()
                .antMatchers(resources).permitAll()
                .anyRequest().authenticated()
                .and()
            .formLogin()
                .loginPage("/login")
                .permitAll()
                .and()
            .logout().logoutUrl("/404")
                .permitAll();
        super.configure(http);
    }
}
4
Huangxu Huang

私は私の春のブートアプリケーションで同じ問題を抱えていたので、私はあなたたちと私のソリューションを共有するといいと思いました。 antMatchersを特定の種類の塗りつぶしに合わせて設定するだけです。私の場合、それはjs filles and js.mapのみでした。コードは次のとおりです。

   @Configuration
   @EnableWebSecurity
   public class SecurityConfig extends WebSecurityConfigurerAdapter {

   @Override
   protected void configure(HttpSecurity http) throws Exception {
       http.authorizeRequests()
      .antMatchers("/index.html", "/", "/home", 
       "/login","/favicon.ico","/*.js","/*.js.map").permitAll()
      .anyRequest().authenticated().and().csrf().disable();
   }
  }

面白いのは何ですか。 resources path like "resources/myStyle.css" antMatcherが機能しなかったことがわかりました私にとっては。 resorucesフォルダー内にフォルダーがある場合は、antMatcherに"/ myFolder/myFille.js" *のように追加するだけで問題なく動作するはずです。

1
Komoito