feat(security): 完善JWT认证与权限拒绝处理逻辑

- 为JwtAccessDeniedHandler添加详细注释和中文错误提示- 在JwtAuthenticationEntryPoint中优化响应编码和状态码设置
- 统一使用UTF-8字符编码确保中文正确显示- 设置响应内容类型为JSON格式
- 明确设置HTTP状态码403和401对应权限问题- 添加WebConfig中静态资源处理器配置注释- 配置"/uploads/**"路径映射到服务器"uploads/"目录- 更新生肖文档结构,增加章节标题和内容调整
This commit is contained in:
ikmkj
2025-10-12 22:14:35 +08:00
parent f0a8a20837
commit 3e252e0043
4 changed files with 29 additions and 2 deletions

View File

@@ -18,8 +18,16 @@ public class WebConfig implements WebMvcConfigurer {
.maxAge(3600); // 预检请求缓存时间
}
/**
* 重写父类方法,配置静态资源处理器
* 该方法用于配置静态资源的访问路径和实际存储位置
*
* @param registry 资源处理器注册对象,用于注册静态资源处理器
*/
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
// 添加资源处理器,配置"/uploads/**"路径下的请求
// 将这些请求映射到服务器的"uploads/"目录
registry.addResourceHandler("/uploads/**")
.addResourceLocations("file:uploads/");
}

View File

@@ -20,16 +20,30 @@ import java.io.IOException;
public class JwtAccessDeniedHandler implements AccessDeniedHandler {
@Override
/**
* 处理访问被拒绝的方法
* @param request HttpServletRequest对象包含请求信息
* @param response HttpServletResponse对象用于构建响应
* @param accessDeniedException 访问被拒绝异常,包含拒绝访问的详细信息
* @throws IOException 可能发生的IO异常
* @throws ServletException 可能发生的Servlet异常
*/
public void handle(HttpServletRequest request,
HttpServletResponse response,
AccessDeniedException accessDeniedException) throws IOException, ServletException {
// 设置响应字符编码为UTF-8
response.setCharacterEncoding("UTF-8");
// 设置响应内容类型为JSON
response.setContentType("application/json");
// 设置响应状态码为403禁止访问
response.setStatus(HttpServletResponse.SC_FORBIDDEN); // 403
// 创建并返回一个失败结果对象,提示权限不足
R<String> result = R.fail("权限不足,无法访问此资源");
// 创建ObjectMapper实例用于对象与JSON之间的转换
ObjectMapper objectMapper = new ObjectMapper();
// 将结果对象转换为JSON字符串并写入响应输出流
response.getWriter().write(objectMapper.writeValueAsString(result));
}
}

View File

@@ -23,11 +23,14 @@ public class JwtAuthenticationEntryPoint implements AuthenticationEntryPoint {
public void commence(HttpServletRequest request,
HttpServletResponse response,
AuthenticationException authException) throws IOException, ServletException {
// 设置响应字符编码为UTF-8确保中文正确显示
response.setCharacterEncoding("UTF-8");
// 设置响应内容类型为JSON格式
response.setContentType("application/json");
// 设置HTTP状态码为401表示未授权
response.setStatus(HttpServletResponse.SC_UNAUTHORIZED); // 401
// 创建一个包含中文错误信息的R对象
// 创建一个包含中文错误信息的R对象R可能是自定义的响应结果封装类
R<String> result = R.fail("认证失败,请重新登录");
// 使用ObjectMapper将对象转换为JSON字符串并写入响应