This commit is contained in:
luke 2025-06-07 00:59:37 +08:00
parent 6a135421f5
commit 4be29b3d85
4 changed files with 28 additions and 10 deletions

View File

@ -60,8 +60,8 @@ CREATE TABLE IF NOT EXISTS user_token (
id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '主键,自增', id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '主键,自增',
user_id BIGINT NOT NULL COMMENT '用户ID业务逻辑关联user表', user_id BIGINT NOT NULL COMMENT '用户ID业务逻辑关联user表',
token VARCHAR(128) NOT NULL UNIQUE COMMENT '用户登录token', token VARCHAR(128) NOT NULL UNIQUE COMMENT '用户登录token',
login_at BIGINT NOT NULL COMMENT '登录时间(毫秒时间戳)', login_at DATETIME NOT NULL COMMENT '登录时间',
expired_at BIGINT NOT NULL COMMENT '过期时间(毫秒时间戳)', expired_at DATETIME NOT NULL COMMENT '过期时间',
add_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '添加时间', add_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '添加时间',
update_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', update_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
INDEX idx_user_id(user_id), INDEX idx_user_id(user_id),

View File

@ -1,11 +1,12 @@
package com.knowledge.base.application.filter; package com.knowledge.base.application.filter;
import cn.hutool.core.util.StrUtil;
import com.knowledge.base.domain.user.service.UserService; import com.knowledge.base.domain.user.service.UserService;
import com.knowledge.base.infrastructure.north.controller.UserController;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import javax.servlet.*; import javax.servlet.*;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponse;
import java.io.IOException; import java.io.IOException;
@ -20,6 +21,8 @@ public class AuthFilter implements Filter {
@Autowired @Autowired
private UserService userService; private UserService userService;
private static final String COOKIE_KEY = "auth_token";
@Override @Override
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)
throws IOException, ServletException { throws IOException, ServletException {
@ -32,7 +35,20 @@ public class AuthFilter implements Filter {
// 需要鉴权的路径前缀 // 需要鉴权的路径前缀
if (path.startsWith("/search")) { if (path.startsWith("/search")) {
String token = request.getHeader("Authorization"); String token = request.getHeader("Authorization");
if (!userService.isValidToken(token)) {
if (StrUtil.isBlank(token)) {
Cookie[] cookies = request.getCookies();
if (cookies != null) {
for (Cookie cookie : cookies) {
if (COOKIE_KEY.equals(cookie.getName())) {
token = cookie.getValue();
break;
}
}
}
}
if (token == null || !userService.isValidToken(token)) {
response.setStatus(HttpServletResponse.SC_UNAUTHORIZED); response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
response.getWriter().write("Invalid or expired token"); response.getWriter().write("Invalid or expired token");
return; return;
@ -42,4 +58,3 @@ public class AuthFilter implements Filter {
chain.doFilter(req, res); chain.doFilter(req, res);
} }
} }

View File

@ -16,9 +16,11 @@ public class UserToken {
private String token; private String token;
private Long loginAt; @TableField("login_at")
private LocalDateTime loginAt;
private Long expiredAt; @TableField("expired_at")
private LocalDateTime expiredAt;
@TableField(fill = FieldFill.INSERT) @TableField(fill = FieldFill.INSERT)
private LocalDateTime addTime; private LocalDateTime addTime;

View File

@ -9,6 +9,7 @@ import com.knowledge.base.infrastructure.util.crypto.SM3Util;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import java.time.LocalDateTime;
import java.util.Optional; import java.util.Optional;
import java.util.UUID; import java.util.UUID;
@ -44,12 +45,12 @@ public class UserServiceImpl implements UserService {
@Override @Override
public UserToken createToken(Long userId, long expireMs) { public UserToken createToken(Long userId, long expireMs) {
String token = UUID.randomUUID().toString().replace("-", ""); String token = UUID.randomUUID().toString().replace("-", "");
long now = System.currentTimeMillis(); LocalDateTime now = LocalDateTime.now();
UserToken userToken = new UserToken(); UserToken userToken = new UserToken();
userToken.setUserId(userId); userToken.setUserId(userId);
userToken.setToken(token); userToken.setToken(token);
userToken.setLoginAt(now); userToken.setLoginAt(now);
userToken.setExpiredAt(now + expireMs); userToken.setExpiredAt(now.plusNanos(expireMs * 1_000_000));
tokenRepository.save(userToken); tokenRepository.save(userToken);
return userToken; return userToken;
} }
@ -67,7 +68,7 @@ public class UserServiceImpl implements UserService {
@Override @Override
public boolean isValidToken(String token) { public boolean isValidToken(String token) {
return tokenRepository.findByToken(token) return tokenRepository.findByToken(token)
.filter(t -> System.currentTimeMillis() < t.getExpiredAt()) .filter(t -> LocalDateTime.now().isBefore(t.getExpiredAt()))
.isPresent(); .isPresent();
} }