web-dev-qa-db-fra.com

Spring Security "Refusé d'exécuter le script de ..."

Je construis une application Spring MVC avec Spring Security et Bootstrap dans mes fichiers HTML (modèles thymeleaf). La partie Spring Security est basée sur Spring Guide pour Spring Security et est associée à un serveur d’applications Spring Boot.

Après l’activation de Spring Security, le fichier css d’initialisation ne se charge pas avec le message d’erreur:

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. 

Le message d'erreur ci-dessus provient de la console de développeur Chrome.

Ce que j'ai essayé:

  • Désactiver Spring Security => Bootstrap css fonctionne à nouveau, mais j’ai besoin de la sécurité
  • Recherche sur les forums de printemps, mais il y a un lien en boucle sans solution
  • Ajout d'un gestionnaire de ressources, mais je ne peux pas voir que le gestionnaire est appelé ni que l'erreur disparaît
  • Ajout du chemin des ressources à l'appel permit

Ma structure de dir:

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

BootStart.Java est le fichier Java récupéré par Spring Boot. 

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>

Actuellement, j'utilise les dépendances suivantes dans mon 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>

Comment dois-je configurer Spring Security pour pouvoir charger des fichiers css/js à partir de mon répertoire/ressources statiques?

16
somenone

S'il vous plaît vérifier cette réponse par d'autres avec une question similaire.

Si vous placez des fichiers js dans le répertoire /js/, il ne devrait pas y avoir ce genre d’erreur MIME.
Et pour les fichiers javascript, il est préférable de désactiver la sécurité pour ceux-ci:

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

J'ai eu la même erreur aussi avec la même structure de dossier, c'était sur le fichier css.

Tout ce que j'ai fait est ajouté /css/** dans antMatcher () comme ci-dessous:

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

}

Dans votre cas, ajoutez simplement /js/** dans antMatcher (), puis utilisez permitAll ()

4
da-vinci-code

quand on utilise "permitall ()" ou des demandes() puis il active la vérification Mime, de sorte que je spécifie toutes les listes d’URL utilisées pour être accecs.

0
fresher

J'ai eu la même erreur après avoir ajouté une nouvelle méthode à un contrôleur. 

J'ai oublié de fournir une valeur pour l'annotation @GetMapping et le @Controller lui-même n'était lié à aucune URL. Assez curieusement, ajouter @GetMapping("/foo") à ma méthode a résolu le problème. Je n'ai toujours pas compris pourquoi, mais je compte le savoir.

0
Peter Catalin

J'ai supprimé tous les commentaires du début du fichier css et cela fonctionne.

0
nllsdfx

J'ai utilisé cela pour résoudre mon problème, vous pouvez essayer ceci

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

J'espère que ça vous aidera.

0
Wei Chun