From 1c8b29e249a6e1711ee8d6609ef2d9f4f0c1b128 Mon Sep 17 00:00:00 2001 From: luke Date: Sun, 25 May 2025 10:13:16 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E7=99=BB=E5=BD=95&token?= =?UTF-8?q?=E6=A0=A1=E9=AA=8C=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../parser/application/filter/AuthFilter.java | 40 +++++++++++ .../north/controller/LoginController.java | 66 +++++++++++++++++++ 2 files changed, 106 insertions(+) create mode 100644 src/main/java/com/doc/parser/application/filter/AuthFilter.java create mode 100644 src/main/java/com/doc/parser/infrastructure/north/controller/LoginController.java diff --git a/src/main/java/com/doc/parser/application/filter/AuthFilter.java b/src/main/java/com/doc/parser/application/filter/AuthFilter.java new file mode 100644 index 0000000..5a6fea1 --- /dev/null +++ b/src/main/java/com/doc/parser/application/filter/AuthFilter.java @@ -0,0 +1,40 @@ +package com.doc.parser.application.filter; + +import com.doc.parser.infrastructure.north.controller.LoginController; +import org.springframework.stereotype.Component; + +import javax.servlet.*; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; + +/** + * @author Luke.ye + * @date 2025/5/25 10:05 + */ +@Component +public class AuthFilter implements Filter { + + @Override + public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) + throws IOException, ServletException { + + HttpServletRequest request = (HttpServletRequest) req; + HttpServletResponse response = (HttpServletResponse) res; + + String path = request.getRequestURI(); + + // 需要鉴权的路径前缀 + if (path.startsWith("/search")) { + String token = request.getHeader("Authorization"); + if (!LoginController.isValidToken(token)) { + response.setStatus(HttpServletResponse.SC_UNAUTHORIZED); + response.getWriter().write("Invalid or expired token"); + return; + } + } + + chain.doFilter(req, res); + } +} + diff --git a/src/main/java/com/doc/parser/infrastructure/north/controller/LoginController.java b/src/main/java/com/doc/parser/infrastructure/north/controller/LoginController.java new file mode 100644 index 0000000..bc980ab --- /dev/null +++ b/src/main/java/com/doc/parser/infrastructure/north/controller/LoginController.java @@ -0,0 +1,66 @@ +package com.doc.parser.infrastructure.north.controller; + +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +import java.util.*; +import java.util.concurrent.ConcurrentHashMap; + +/** + * @author Luke.ye + * @date 2025/5/25 10:02 + */ +@RestController +@RequestMapping("/api/v1/user") +public class LoginController { + + private static final Map USER_DB = Map.of( + "admin", "123456", + "user", "abc123" + ); + + // token -> timestamp + private static final Map tokenStore = new ConcurrentHashMap<>(); + + // token -> username + private static final Map userMap = new ConcurrentHashMap<>(); + + private static final long TOKEN_EXPIRE_MS = 24 * 60 * 60 * 1000L; // 24 小时 + + @PostMapping("/login") + public ResponseEntity login(@RequestBody Map body) { + String username = body.getOrDefault("username", "").trim(); + String password = body.getOrDefault("password", "").trim(); + + if (!USER_DB.containsKey(username) || !USER_DB.get(username).equals(password)) { + return ResponseEntity.status(401).body(Map.of("message", "用户名或密码错误")); + } + + String token = UUID.randomUUID().toString(); + token = token.replace("-", ""); + tokenStore.put(token, System.currentTimeMillis()); + userMap.put(token, username); + + return ResponseEntity.ok(Map.of( + "token", token, + "username", username + )); + } + + public static boolean isValidToken(String token) { + if (token == null || !tokenStore.containsKey(token)) return false; + long loginAt = tokenStore.get(token); + long now = System.currentTimeMillis(); + if (now - loginAt > TOKEN_EXPIRE_MS) { + tokenStore.remove(token); + userMap.remove(token); + return false; + } + return true; + } + + public static Optional getUsername(String token) { + return Optional.ofNullable(userMap.get(token)); + } +} +