使用 Spring Boot 3.2.5 和安全设置访问静态元素

问题描述 投票:0回答:1

使用此安全设置,我无法从 Spring Boot 3.2.5 应用程序访问 HTML 页面上的静态元素:

@Configuration
@EnableWebSecurity
public class SecurityConfig {

@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
    
    http
        .csrf(csrf -> csrf
            .csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse())
            .ignoringRequestMatchers("/redsys/**")
        )
        .authorizeHttpRequests(authorize -> authorize                        
            .requestMatchers("/images/**", "/js**", "/css/**", "/webjars/**").permitAll()  
            .requestMatchers("/admin/**").hasRole("USER")
            .requestMatchers("/backstage/**").hasRole("ADMIN")
            .requestMatchers("/actuator/**").hasRole("ADMIN")
            .anyRequest().permitAll()
        )
        .formLogin(formLogin -> formLogin
            .loginPage("/login").permitAll()
            .loginProcessingUrl("/perform_login")    
            .defaultSuccessUrl("/admin")
            .failureUrl("/login?error=true")    
        )
        .logout(logOut -> logOut
            .deleteCookies("JSESSIONID")
        )
        .sessionManagement(session -> session
            .maximumSessions(5).expiredUrl("/login?logout")
        );
                    
    return http.build();
}

这是 HTML 页面:

<html>
    <head>
        <link rel="icon" type="image/png" href="/images/rentalwebs50.png"/>
        <meta name="_csrf" th:content="${_csrf.token}"/>
    <meta name="_csrf_header" th:content="${_csrf.headerName}"/>
    </head>
    <body>
        <h1>Login</h1>
        <form name='f' action="login" method='POST'>
           <table>
               <tr>
                  <td>User:</td>
                  <td><input type='text' name='username' value=''></td>
               </tr>
               <tr>
                  <td>Password:</td>
                  <td><input type='password' name='password' /></td>
               </tr>
               <tr>
                  <td><input id="submitButton" name="submit" type="submit" value="submit" /></td>
               </tr>
            </table>
         </form>
         <img scr="/images/rentalwebs50.png" alt="testing static resources"></img>
   </body>
   <footer>
       <script src="/js/CsrfToken.js" type="application/javascript"></script>
   </footer>
</html>

这些是静态资源,无法访问,其路径进入文件结构:

  • /src/main/resources/static/images/rentalwebs50.png
  • /src/main/resources/static/js/CsrfToken.js”

最后,浏览器对 javascript 文件出现以下错误: CsrfToken.js:加载资源失败:服务器响应状态为404()

spring-mvc spring-security
1个回答
0
投票

问题在于,在 WebMvcConfigurer 实现中,存在 @EnableWebMvc 注释。

@EnableWebMvc 禁用 Spring Boot 对 MVC 的自动配置,因此静态资源的标准路径(/src/main/resources/static/)不起作用,除非手动将其配置到属性文件中。

© www.soinside.com 2019 - 2024. All rights reserved.