web-dev-qa-db-fra.com

La sécurité Spring ne permet pas le chargement des ressources CSS ou JS

La ressource se trouve sous src/main/resources/static/css ou src/main/resources/static/js, j'utilise spring boot, et la classe de sécurité est:

@Configuration
@EnableWebMvcSecurity
@EnableGlobalAuthentication
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
//      http.authorizeRequests().antMatchers("/", "/index", "/quizStart")
//              .permitAll().anyRequest().authenticated();
//      http.formLogin().loginPage("/login").permitAll().and().logout()
//              .permitAll();
    }

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

Cela fonctionne bien (les ressources peuvent être chargées) lorsque j'accède à "/ index" à partir du navigateur, cependant, si je décommente les quatre lignes de la classe, les ressources ne peuvent pas être chargées, les quatre lignes signifie:

    http.authorizeRequests().antMatchers("/", "/index", "/quizStart")
            .permitAll().anyRequest().authenticated();
    http.formLogin().loginPage("/login").permitAll().and().logout()
            .permitAll();

Quelqu'un pourrait-il m'aider? Merci d'avance.

29
Junjie

Vous voudrez probablement vous assurer que votre répertoire contenant ces éléments est défini comme permitAll.

Voici un extrait de mon fichier de contexte de sécurité de printemps. Sous le répertoire des ressources, j'ai des dossiers js, css et images qui sont autorisés par cette ligne.

<security:intercept-url pattern="/resources/**" access="permitAll" />
23

Pour une raison quelconque, cela n'a pas fonctionné pour moi:

http.authorizeRequests().antMatchers("/resources/**").permitAll();

Je devais ajouter ceci:

http.authorizeRequests().antMatchers("/resources/**").permitAll().anyRequest().permitAll();

De plus, cette ligne doit être après le code qui restreint l'accès.

18
Sande

Ajouter ce qui suit

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

vous pouvez également utiliser directement comme "/*.js" pour un fichier spécifique ou "/ resources/**" pour le répertoire

 http.authorizeRequests()
                .antMatchers("/", "/login", "/logout", "/error").permitAll()
                .antMatchers("/resources/**").permitAll()
                .antMatchers("/*.js").permitAll()
                .antMatchers("/api/**").authenticated()
4
Om Sharma

J'ai eu le même problème et changer l'accès à "permitAll" n'a pas aidé. J'ai créé un nouveau modèle http dans lequel j'ai défini la sécurité sur "aucun", puis j'ai pu télécharger les fichiers css et js sans authentification.

<http pattern="/resources/**" security="none" />
0
JohnP

Cela a finalement fonctionné pour moi. Le/home (qui affichera la page de connexion) et les messages d'erreur n'ont pas besoin d'authentification. Toutes les ressources sont permitAll et l'url/main est authentifiée. Toute autre URL (par exemple./Utilisateurs/clients, etc.) devra être ajoutée comme isAuthenticated ()

  <security:intercept-url pattern="/home" access="isAnonymous()"/>
  <security:intercept-url pattern="/error*" access="isAnonymous()"/>      
  <security:intercept-url pattern="/main" access="isAuthenticated()"/>
  <security:intercept-url pattern="/css/**" access="permitAll" />     
  <security:intercept-url pattern="/js/**" access="permitAll" />
  <security:intercept-url pattern="/fonts/**" access="permitAll" />
  <security:intercept-url pattern="/images/**" access="permitAll" />
0
Shahriar