使用此安全设置,我无法从 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>
这些是静态资源,无法访问,其路径进入文件结构:
最后,浏览器对 javascript 文件出现以下错误: CsrfToken.js:加载资源失败:服务器响应状态为404()
问题在于,在 WebMvcConfigurer 实现中,存在 @EnableWebMvc 注释。
@EnableWebMvc 禁用 Spring Boot 对 MVC 的自动配置,因此静态资源的标准路径(/src/main/resources/static/)不起作用,除非手动将其配置到属性文件中。