feat(security): 添加 JWT 认证功能

- 在后端添加 JWT 认证过滤器 JwtAuthenticationTokenFilter
- 创建 JwtTokenUtil 工具类用于生成和验证 JWT token
- 在 application.yml 中配置 JWT 相关参数
- 更新前端 HomePage 组件,增加用户认证相关逻辑
This commit is contained in:
2025-07-31 09:27:13 +08:00
parent 4e0977de85
commit ab4891d8db
14 changed files with 773 additions and 260 deletions

View File

@@ -19,7 +19,7 @@ public interface UserService extends IService<User> {
* @param password 密码
* @return 登录成功的用户
*/
User login(String username, String password);
String login(String username, String password);
/**
* 用户删除

View File

@@ -6,21 +6,34 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.test.bijihoudaun.entity.User;
import com.test.bijihoudaun.mapper.UserMapper;
import com.test.bijihoudaun.service.UserService;
import com.test.bijihoudaun.util.JwtTokenUtil;
import com.test.bijihoudaun.util.PasswordUtils;
import com.test.bijihoudaun.util.UuidV7;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.stereotype.Service;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService, UserDetailsService {
@Autowired
private UserMapper userMapper;
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
User user = userMapper.findByUsername(username);
if (user == null) {
throw new UsernameNotFoundException("User not found with username: " + username);
}
return new org.springframework.security.core.userdetails.User(user.getUsername(), user.getPassword(), new ArrayList<>());
}
@Override
public User register(String username, String password, String email) {
String encrypt = PasswordUtils.encrypt(password);
@@ -43,23 +56,16 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
return user;
}
@Autowired
private JwtTokenUtil jwtTokenUtil;
@Override
public User login(String username, String password) {
LambdaQueryWrapper<User> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(User::getUsername, username);
User user = userMapper.selectOne(queryWrapper);
boolean verify = PasswordUtils.verify(password, user.getPassword());
if (!verify) {
public String login(String username, String password) {
UserDetails userDetails = loadUserByUsername(username);
if (!PasswordUtils.verify(password, userDetails.getPassword())) {
throw new RuntimeException("密码错误");
}
user.setToken(UuidV7.uuidNoHyphen());
// 过期时间:当前时间+3天的时间
// 修改时间计算方式
Calendar calendar = Calendar.getInstance();
calendar.add(Calendar.DAY_OF_MONTH, 3); // 增加3天
user.setTokenEnddata(calendar.getTime());
userMapper.updateById(user);
return user;
return jwtTokenUtil.generateToken(userDetails);
}
@Override