Browse Source

后端整合模块

detached
huangqizhen 5 months ago
parent
commit
80bd996d75
  1. 1
      pom.xml
  2. 2
      src/main/java/com/example/demo/Util/RequestWrapper.java
  3. 2
      src/main/java/com/example/demo/domain/entity/Recharge.java
  4. 5
      src/main/java/com/example/demo/security/SecurityConfig.java
  5. 142
      src/main/java/com/example/demo/security/TokenFilter.java
  6. 21
      src/main/java/com/example/demo/security/UploadFilter.java

1
pom.xml

@ -44,6 +44,7 @@
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>

2
src/main/java/com/example/demo/Util/RequestWrapper.java

@ -26,7 +26,7 @@ public class RequestWrapper extends HttpServletRequestWrapper {
// 将body数据存储起来
String bodyStr = getBodyString(request);
body = bodyStr.getBytes(Charset.defaultCharset());
// System.out.println(new String(body, Charset.defaultCharset()) + "+**+*+*+*++*+*+*+");
System.out.println(new String(body, Charset.defaultCharset()) + "+**+*+*+*++*+*+*+");
}

2
src/main/java/com/example/demo/domain/entity/Recharge.java

@ -33,5 +33,5 @@ public class Recharge {
private Date endDate;
private String orderCode;
private String token;
private Integer rateId;
}

5
src/main/java/com/example/demo/security/SecurityConfig.java

@ -67,9 +67,8 @@ public class SecurityConfig {
).permitAll()
.anyRequest().authenticated() // 其它路径必须要登录后才能访问
);
// 配置Token过滤器, 将过滤器加入到执行链中
http.addFilterBefore(tokenFilter, UsernamePasswordAuthenticationFilter.class);
// http.addFilterBefore(uploadFilter, UsernamePasswordAuthenticationFilter.class);
// http.addFilterBefore(uploadFilter, UsernamePasswordAuthenticationFilter.class); // 确保UploadFilter是第一个
http.addFilterBefore(tokenFilter, UsernamePasswordAuthenticationFilter.class); // 然后是TokenFilter
return http.build();
}

142
src/main/java/com/example/demo/security/TokenFilter.java

@ -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,48 +141,54 @@ 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(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中
UsernamePasswordAuthenticationToken authenticationToken
= new UsernamePasswordAuthenticationToken(
userDetails, null,
userDetails.getAuthorities());
authenticationToken.setDetails(new WebAuthenticationDetailsSource().buildDetails(requestWrapper));
SecurityContextHolder.getContext().setAuthentication(authenticationToken);
// 检查是否是上传请求
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());
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状态码等
}
} catch (Exception e) {
e.printStackTrace();
// Token无效可以在这里添加相应的处理逻辑例如返回401状态码等
}
}
System.out.println(token + "*-*-*-*-*-*");
// 非上传请求继续执行过滤器链
filterChain.doFilter(requestWrapper, response);
}
filterChain.doFilter(requestWrapper, response); // 注意这里使用requestWrapper
}
}
}

21
src/main/java/com/example/demo/security/UploadFilter.java

@ -4,21 +4,34 @@
//import jakarta.servlet.ServletException;
//import jakarta.servlet.http.HttpServletRequest;
//import jakarta.servlet.http.HttpServletResponse;
//import org.springframework.core.annotation.Order;
//import org.springframework.stereotype.Component;
//import org.springframework.web.filter.OncePerRequestFilter;
//import org.springframework.web.multipart.MultipartResolver;
//
//import java.io.IOException;
//
//
//@Component
//public class UploadFilter extends OncePerRequestFilter {
//
// private final MultipartResolver multipartResolver;
//
// public UploadFilter(MultipartResolver multipartResolver) {
// this.multipartResolver = multipartResolver;
// }
//
// @Override
// protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
// throws ServletException, IOException {
//
// // 检查请求是否为上传请求这里假设上传请求的路径以 "/upload" 开头
// boolean isUploadRequest = request.getRequestURI().startsWith("/upload");
//
// if (isUploadRequest) {
// // 如果是上传请求直接将请求传递给下一个过滤器或目标资源
// System.out.println(isUploadRequest);
// System.out.println("MultipartResolver: " + multipartResolver);
// if (isUploadRequest ) {
// System.out.println("执行upload-------------------------------");
// // 如果是上传请求且Content-Type为multipart/form-data直接将请求传递给下一个过滤器或目标资源
// filterChain.doFilter(request, response);
// } else {
// // 如果不是上传请求执行一些自定义逻辑
@ -28,6 +41,4 @@
// filterChain.doFilter(request, response);
// }
// }
//
//
//}
Loading…
Cancel
Save