我正在使用 Thymeleaf 开发 Spring Boot 项目,并希望启用 CSRF 保护。如何配置 Spring Security 以使用 CSRF 令牌并确保它们正确包含在我的 Thymeleaf 表单中?此外,如果需要,我应该如何处理 AJAX 请求中的 CSRF 令牌?
依赖>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
摇篮:
实现“org.springframework.boot:spring-boot-starter-security”
实现“org.springframework.boot:spring-boot-starter-thymeleaf”
CSRF 保护默认启用。在您的 SecurityConfig 中验证它:
@配置
公共类SecurityConfig {
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
http
.csrf().and() // CSRF enabled by default
.authorizeRequests()
.antMatchers("/public/**").permitAll()
.anyRequest().authenticated()
.and()
.formLogin().loginPage("/login").permitAll()
.and()
.logout().permitAll();
return http.build();
}
}
将 CSRF 令牌添加到您的表单中:
<input type="hidden" th:name="${_csrf.parameterName}" th:value="${_csrf.token}" />
<label for="name">Name:</label>
<input type="text" id="name" name="name">
<button type="submit">Submit</button>
对于 AJAX 请求,请在请求标头中包含 CSRF 令牌:
JavaScript 示例:
const csrfToken = document.querySelector('meta[name="_csrf"]').content;
fetch('/提交', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'X-CSRF-TOKEN': csrfToken
},
body: JSON.stringify({ name: 'Test' })
});
我正在开发一个带有 Thymeleaf 前端的 Spring Boot 应用程序,并且希望仅使用 spring-boot-starter-security 来实现 JWT 身份验证,而不需要任何外部 JWT 库。
要求:
应使用 Base64 和 HMAC SHA256 手动生成和验证 JWT。
为了安全起见,令牌应存储在仅 HTTP 的 cookie 中。
应用程序应具有使用 Thymeleaf 模板的登录和注销功能。
当前设置:
我正在使用以下依赖项:
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
Spring Security 配置为处理身份验证和授权。
Thymeleaf 用于渲染登录页面和主页。
我尝试过的:我实现了一个实用程序类来使用 Base64 编码和 HMAC SHA256 生成和验证 JWT、一个用于验证用户身份并生成令牌的登录控制器以及一个注销机制。但是,我不确定如何构建我的安全配置并在每个请求上验证 JWT,同时保持其安全。
问题:
如何验证每个请求的 JWT 并将其与当前用户会话关联?
将 JWT 存储在仅 HTTP 的 cookie 中足以保证安全吗?
这种方法在仍然仅使用 Spring Security 和 Thymeleaf 的情况下是否有任何改进?
代码片段:
这是我的 JWT 实用程序类:
公共类 JwtUtil {
private static final String SECRET_KEY = "your-256-bit-secret";
private static final String ALGORITHM = "HmacSHA256";
public String generateToken(String username) {
// Generate token logic
}
public String extractUsername(String token) {
// Extract username logic
}
public boolean validateToken(String token) {
// Validate token logic
}
}
这是我的登录控制器:
@控制器
公共类LoginController {
@PostMapping("/login")
public String login(String username, String password, HttpServletResponse response) {
// Authenticate user and generate JWT
}
@GetMapping("/home")
public String home() {
return "home";
}
}
预期行为:
用户应通过 Thymeleaf 登录页面登录。
成功登录后,应生成 JWT 令牌并将其存储在仅 HTTP 的 cookie 中。
应用程序应验证每个请求的令牌并限制对经过身份验证的用户的访问。
如有任何指导、更正或建议,我们将不胜感激!
如果您想在发布之前进一步修改此内容,请告诉我 克!