web-dev-qa-db-ja.com

Spring Security「...からのスクリプトの実行を拒否しました」

私は、Spring SecurityおよびBootstrap HTMLファイル(thymeleafテンプレート)でSpring MVCアプリケーションを構築しています。SpringSecurityの部分は、Spring Guideに基づいています Spring Security =そして、Spring Bootアプリケーションサーバーと組み合わされます。

Spring Securityを有効にすると、bootstrap cssファイルが読み込まれず、エラーメッセージが表示されます。

Refused to execute script from 'http://localhost:8080/js/bootstrap.min.js' because its MIME type ('text/html') is not executable, and strict MIME type checking is enabled. 

上記のエラーメッセージは、chrome開発者コンソールからのものです。

私が試したこと:

  • Spring Securityを無効にする=> bootstrap cssは再び機能しますが、セキュリティが必要です
  • 春のフォーラムで検索していますが、解決策のないループされたリンクがあります
  • リソースハンドラーを追加しましたが、ハンドラーが呼び出されず、エラーも表示されません。
  • permit呼び出しへのリソースパスの追加

私のディレクトリ構造:

/main
  |-> /Java
       | BootStart.Java
       |-> /security
              |SecurityConfiguration.Java
  |-> /resources
         |-> /static
               |-> /css /** bootstrap location */
               |-> /js
               |-> /fonts
         |-> /templates
               | /user
                   | sample.html

BootStart.Javaは、Spring Bootによって取得されるJavaファイルです。

BootStart.Java:

@EnableAutoConfiguration
@ComponentScan
public class BootStart {
    public static void main(String[] args) {
        SpringApplication.run(BootStart.class, args);
    }
}

SecurityConfiguration.Java:

@Configuration
@EnableWebSecurity
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
                .formLogin()
                .loginPage("/login")
                .permitAll()
                .and()
                .logout()
                .permitAll();
        http
                .authorizeRequests()
                .antMatchers("/", "/resources/static/**").permitAll()
                .anyRequest().authenticated();

    }

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth
                .inMemoryAuthentication()
                .withUser("user").password("password").roles("USER");
    }
}

Sample.html:

<!DOCTYPE HTML>
<html>
<head>
    <link rel="stylesheet" th:href="@{/css/bootstrap.css}" href="../../css/bootstrap.min.css"/>
    <link rel="stylesheet" th:href="@{/css/bootstrap-theme.css}" href="../../css/bootstrap-theme.min.css"/>
    <title></title>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
</head>
<body>
<div class="alert alert-danger" role="alert">!Basic template!</div>

<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<script src="js/bootstrap.min.js"></script>

</body>
</html>

現在、私のpomで次の依存関係を使用しています。

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.security</groupId>
    <artifactId>spring-security-core</artifactId>
    <version>3.2.4.RELEASE</version>
</dependency>
<dependency>
    <groupId>org.springframework.security</groupId>
    <artifactId>spring-security-web</artifactId>
    <version>3.2.4.RELEASE</version>
</dependency>
<dependency>
    <groupId>org.springframework.security</groupId>
    <artifactId>spring-security-config</artifactId>
    <version>3.2.4.RELEASE</version>
</dependency>

/ static resourcesディレクトリからcss/jsファイルをロードできるようにSpring Securityを構成するにはどうすればよいですか?

21
somenone

answer 他の同様の質問を確認してください。

Jsファイルを/js/ dir、そのようなMIMEエラーはありません。
また、JavaScriptファイルの場合は、セキュリティを無効にすることをお勧めします。

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

同じフォルダ構造で同じエラーが発生しました。CSSファイルにありました。

私がしたすべてが追加されます/css/**以下のantMatcher()で:

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

    httpSecurity
        .authorizeRequests()
            .antMatchers("/css/**").permitAll() //Adding this line solved it
            .anyRequest().fullyAuthenticated()
            .and()
        .formLogin()
            .loginPage("/login").permitAll()
            .loginProcessingUrl("/sign-in")
            .defaultSuccessUrl("/home")
            .failureUrl("/error")
            .and()
        .logout()
            .logoutSuccessUrl("/logout")
            .permitAll()
            .and()
        .csrf().disable();

}

あなたの場合は単に/js/**をantMatcher()で実行してから、permitAll()を使用します。

10
da-vinci-code

私にはこの問題があり、しばらくの間苦労しました。すべての「一致しない」ルートに一致するルートを作成し、index.htmlを送信しました。

@Controller
public class DefaultPageController {
  @Autowired
  private LogService logService;

  @GetMapping("/*")
  public String defaultPage(Model model){
      logService.saveLog(Log.LogType.INFO, null, "Default route");
      return "index";
  }
}

問題は、ルート/file.jsを上書きし、静的ファイルを送信せず、常にindex.htmlを送信することでした。

したがって、解決策はルートをカスタマイズすることだけでした。

1

私はこれを使って私の問題を解決しました、あなたはこれを試すことができます

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

お役に立てば幸いです。

1
Wei Chun

私たちが使用するときpermitall()"または anyrequest() 次に、MIMEチェックを有効にするため、アクセスに使用するすべてのURLリストを指定します。

0
fresher

コントローラに新しいメソッドを追加した後も同じエラーが発生しました。

_@GetMapping_アノテーションの値を指定するのを忘れており、_@Controller_自体がどのURLにもバインドされていませんでした。私のメソッドに@GetMapping("/foo")を追加すると問題が解決しました。それがなぜ起こったのかはまだわかりませんが、調べるつもりです。

0
Peter Catalin

私はcssファイルの最初からコメントを削除し、それは動作します。

0
nllsdfx