|
|
@ -52,6 +52,72 @@ |
|
|
|
// filterChain.doFilter(request, response); |
|
|
|
// } |
|
|
|
//} |
|
|
|
//package com.example.demo.security; |
|
|
|
// |
|
|
|
//import com.example.demo.Util.JWTUtil; |
|
|
|
//import com.example.demo.Util.RequestWrapper; |
|
|
|
//import com.example.demo.Util.TokenPayload; |
|
|
|
//import com.example.demo.domain.entity.Admin; |
|
|
|
//import com.fasterxml.jackson.databind.ObjectMapper; |
|
|
|
//import jakarta.servlet.FilterChain; |
|
|
|
//import jakarta.servlet.ServletException; |
|
|
|
//import jakarta.servlet.http.HttpServletRequest; |
|
|
|
//import jakarta.servlet.http.HttpServletResponse; |
|
|
|
//import org.springframework.core.annotation.Order; |
|
|
|
//import org.springframework.security.access.prepost.PreFilter; |
|
|
|
//import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; |
|
|
|
//import org.springframework.security.core.context.SecurityContextHolder; |
|
|
|
//import org.springframework.security.core.userdetails.UserDetails; |
|
|
|
//import org.springframework.security.web.authentication.WebAuthenticationDetailsSource; |
|
|
|
//import org.springframework.stereotype.Component; |
|
|
|
//import org.springframework.util.ObjectUtils; |
|
|
|
//import org.springframework.util.StringUtils; |
|
|
|
//import org.springframework.web.filter.OncePerRequestFilter; |
|
|
|
//import java.io.IOException; |
|
|
|
//import java.io.InputStream; |
|
|
|
// |
|
|
|
// |
|
|
|
//@Component |
|
|
|
//public class TokenFilter extends OncePerRequestFilter { |
|
|
|
// |
|
|
|
// @Override |
|
|
|
// protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) |
|
|
|
// throws ServletException, IOException { |
|
|
|
// // 使用RequestWrapper包装原始的HttpServletRequest,使其输入流可以被重复读取 |
|
|
|
// RequestWrapper requestWrapper = new RequestWrapper(request); |
|
|
|
// // 确保请求体只被读取一次 |
|
|
|
// boolean hasRequestBody = "POST".equals(requestWrapper.getMethod()); |
|
|
|
// System.out.println("/*-/*-/*"+requestWrapper.getBodyString()); |
|
|
|
// if (hasRequestBody) { |
|
|
|
// // 获取输入流 |
|
|
|
// InputStream inputStream = requestWrapper.getInputStream(); |
|
|
|
// // 使用Jackson ObjectMapper解析JSON |
|
|
|
// ObjectMapper objectMapper = new ObjectMapper(); |
|
|
|
// TokenPayload tokenPayload = objectMapper.readValue(inputStream, TokenPayload.class); |
|
|
|
// |
|
|
|
// // 检查tokenPayload中是否存在token属性,并且这个属性不为空 |
|
|
|
// String token = tokenPayload.getToken(); |
|
|
|
// if (StringUtils.hasText(token)) { |
|
|
|
// try { |
|
|
|
// UserDetails userDetails = JWTUtil.getUserDetailsList(token, Admin.class); |
|
|
|
// if (!ObjectUtils.isEmpty(userDetails)) { |
|
|
|
// // 将这个用户注册到Security中 |
|
|
|
// UsernamePasswordAuthenticationToken authenticationToken |
|
|
|
// = new UsernamePasswordAuthenticationToken( |
|
|
|
// userDetails, null, |
|
|
|
// userDetails.getAuthorities()); |
|
|
|
// authenticationToken.setDetails(new WebAuthenticationDetailsSource().buildDetails(requestWrapper)); |
|
|
|
// SecurityContextHolder.getContext().setAuthentication(authenticationToken); |
|
|
|
// } |
|
|
|
// } catch (Exception e) { |
|
|
|
// e.printStackTrace(); |
|
|
|
// // Token无效,可以在这里添加相应的处理逻辑,例如返回401状态码等 |
|
|
|
// } |
|
|
|
// } |
|
|
|
// } |
|
|
|
// filterChain.doFilter(requestWrapper, response); // 注意这里使用requestWrapper |
|
|
|
// } |
|
|
|
//} |
|
|
|
package com.example.demo.security; |
|
|
|
|
|
|
|
import com.example.demo.Util.JWTUtil; |
|
|
@ -63,7 +129,7 @@ import jakarta.servlet.FilterChain; |
|
|
|
import jakarta.servlet.ServletException; |
|
|
|
import jakarta.servlet.http.HttpServletRequest; |
|
|
|
import jakarta.servlet.http.HttpServletResponse; |
|
|
|
import org.springframework.security.access.prepost.PreFilter; |
|
|
|
import org.springframework.core.annotation.Order; |
|
|
|
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; |
|
|
|
import org.springframework.security.core.context.SecurityContextHolder; |
|
|
|
import org.springframework.security.core.userdetails.UserDetails; |
|
|
@ -75,31 +141,36 @@ import org.springframework.web.filter.OncePerRequestFilter; |
|
|
|
import java.io.IOException; |
|
|
|
import java.io.InputStream; |
|
|
|
|
|
|
|
|
|
|
|
@Component |
|
|
|
public class TokenFilter extends OncePerRequestFilter { |
|
|
|
|
|
|
|
@Override |
|
|
|
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) |
|
|
|
throws ServletException, IOException { |
|
|
|
// 检查是否是上传请求 |
|
|
|
boolean isUploadRequest = request.getRequestURI().startsWith("/upload"); |
|
|
|
System.out.println(request.getRequestURI()); |
|
|
|
System.out.println(isUploadRequest); |
|
|
|
if (isUploadRequest) { |
|
|
|
// 如果是上传请求,直接将请求传递给下一个过滤器或目标资源 |
|
|
|
filterChain.doFilter(request, response); |
|
|
|
return; |
|
|
|
} else { |
|
|
|
// 使用RequestWrapper包装原始的HttpServletRequest,使其输入流可以被重复读取 |
|
|
|
RequestWrapper requestWrapper = new RequestWrapper(request); |
|
|
|
// 确保请求体只被读取一次 |
|
|
|
boolean hasRequestBody = "POST".equals(requestWrapper.getMethod()); |
|
|
|
System.out.println(hasRequestBody); |
|
|
|
if (hasRequestBody) { |
|
|
|
// 获取输入流 |
|
|
|
InputStream inputStream = requestWrapper.getInputStream(); |
|
|
|
// 使用Jackson ObjectMapper解析JSON |
|
|
|
ObjectMapper objectMapper = new ObjectMapper(); |
|
|
|
TokenPayload tokenPayload = objectMapper.readValue(inputStream, TokenPayload.class); |
|
|
|
System.out.println(tokenPayload + "/*/*/*/*/*/*/*"); |
|
|
|
|
|
|
|
// 检查tokenPayload中是否存在token属性,并且这个属性不为空 |
|
|
|
String token = tokenPayload.getToken(); |
|
|
|
System.out.println(token + "*-*-*-*-*-*-*"); |
|
|
|
if (StringUtils.hasText(token)) { |
|
|
|
try { |
|
|
|
System.out.println(token + "*-*-*-*-*-*-*"); |
|
|
|
UserDetails userDetails = JWTUtil.getUserDetailsList(token, Admin.class); |
|
|
|
if (!ObjectUtils.isEmpty(userDetails)) { |
|
|
|
// 将这个用户注册到Security中 |
|
|
@ -115,8 +186,9 @@ public class TokenFilter extends OncePerRequestFilter { |
|
|
|
// Token无效,可以在这里添加相应的处理逻辑,例如返回401状态码等 |
|
|
|
} |
|
|
|
} |
|
|
|
System.out.println(token + "*-*-*-*-*-*"); |
|
|
|
} |
|
|
|
filterChain.doFilter(requestWrapper, response); // 注意这里使用requestWrapper |
|
|
|
// 非上传请求,继续执行过滤器链 |
|
|
|
filterChain.doFilter(requestWrapper, response); |
|
|
|
} |
|
|
|
} |
|
|
|
} |