Initial empty repository
Change-Id: Ie0685414be5495d9da50d659d9ec16ae51487e46
diff --git a/src/main/java/com/example/myproject/service/EmailService.java b/src/main/java/com/example/myproject/service/EmailService.java
new file mode 100644
index 0000000..1ecc8c4
--- /dev/null
+++ b/src/main/java/com/example/myproject/service/EmailService.java
@@ -0,0 +1,20 @@
+
+package com.example.myproject.service;
+public interface EmailService {
+ /**
+ * 发送邮件给指定的邮箱。
+ *
+ * @param to 收件人邮箱地址
+ * @param subject 邮件主题
+ * @param text 邮件内容
+ * @return 发送是否成功
+ */
+ boolean sendEmail(String to, String subject, String text);
+ /**
+ * 生成并发送验证邮件
+ *
+ * @param email 收件人邮箱
+ * @param token
+ */
+ void sendVerificationEmail(String email, String token);
+}
diff --git a/src/main/java/com/example/myproject/service/UserDetailsService.java b/src/main/java/com/example/myproject/service/UserDetailsService.java
new file mode 100644
index 0000000..85d4da2
--- /dev/null
+++ b/src/main/java/com/example/myproject/service/UserDetailsService.java
@@ -0,0 +1,4 @@
+package com.example.myproject.service;
+
+public class UserDetailsService {
+}
diff --git a/src/main/java/com/example/myproject/service/UserService.java b/src/main/java/com/example/myproject/service/UserService.java
new file mode 100644
index 0000000..535f635
--- /dev/null
+++ b/src/main/java/com/example/myproject/service/UserService.java
@@ -0,0 +1,24 @@
+package com.example.myproject.service;
+
+
+
+import com.baomidou.mybatisplus.extension.service.IService;
+
+import com.example.myproject.entity.User;
+
+public interface UserService extends IService<User> {
+ User loginService(String username, String password);
+
+
+ boolean preRegisterUser(User user);
+
+
+ boolean verifyEmail(String email, String token);
+
+
+ boolean checkEmailExists(String email);
+
+ boolean checkPassword(Long userId, String rawPassword);
+
+
+}
\ No newline at end of file
diff --git a/src/main/java/com/example/myproject/service/serviceImpl/EmailServiceImpl.java b/src/main/java/com/example/myproject/service/serviceImpl/EmailServiceImpl.java
new file mode 100644
index 0000000..83500ea
--- /dev/null
+++ b/src/main/java/com/example/myproject/service/serviceImpl/EmailServiceImpl.java
@@ -0,0 +1,51 @@
+
+package com.example.myproject.service.serviceImpl;
+import com.example.myproject.mapper.VerificationTokenMapper;
+import com.example.myproject.entity.VerificationToken;
+import com.example.myproject.service.EmailService;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.mail.javamail.JavaMailSender;
+import org.springframework.mail.javamail.MimeMessageHelper;
+import org.springframework.stereotype.Service;
+import javax.mail.MessagingException;
+import javax.mail.internet.MimeMessage;
+import java.time.Instant;
+@Service
+public class EmailServiceImpl implements EmailService {
+ private static final Logger log = LoggerFactory.getLogger(EmailServiceImpl.class);
+ @Autowired
+ private JavaMailSender mailSender;
+ @Autowired
+ private VerificationTokenMapper verificationTokenMapper;
+ @Value("${spring.mail.username}") // 从配置文件中注入发件人邮箱地址
+ private String fromEmail;
+ @Override
+ public boolean sendEmail(String to, String subject, String text) {
+ log.debug("开始发送验证邮件到:{},主题:{}", to, subject);
+ try {
+ MimeMessage message = mailSender.createMimeMessage();
+ MimeMessageHelper helper = new MimeMessageHelper(message, true);
+ helper.setFrom(fromEmail);
+ helper.setTo(to);
+ helper.setSubject(subject);
+ helper.setText(text, true);
+ mailSender.send(message);
+ log.info("邮件成功发送到:{}", to);
+ return true;
+ } catch (MessagingException e) {
+ log.error("发送邮件失败,收件人:{},错误信息:{}", to, e.getMessage(), e);
+ return false;
+ }
+ }
+ @Override
+ public void sendVerificationEmail(String email, String token){
+ // 发送邮件
+ String message = "<h1>Email Verification</h1>" +
+ "<p>Your verification code is: <b>" + token + "</b></p>" +
+ "<p>This code will expire in 1 hour.</p>";
+ sendEmail(email, "Verify Your Email", message);
+ }
+}
diff --git a/src/main/java/com/example/myproject/service/serviceImpl/UserDetailsServiceImpl.java b/src/main/java/com/example/myproject/service/serviceImpl/UserDetailsServiceImpl.java
new file mode 100644
index 0000000..4bbd5c3
--- /dev/null
+++ b/src/main/java/com/example/myproject/service/serviceImpl/UserDetailsServiceImpl.java
@@ -0,0 +1,47 @@
+package com.example.myproject.service.serviceImpl;
+
+import com.example.myproject.mapper.UserMapper;
+import com.example.myproject.entity.User;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.core.GrantedAuthority;
+import org.springframework.security.core.authority.AuthorityUtils;
+import org.springframework.security.core.authority.SimpleGrantedAuthority;
+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.util.ArrayList;
+import java.util.List;
+
+@Service
+public class UserDetailsServiceImpl implements UserDetailsService {
+
+ @Autowired
+ private UserMapper userMapper;
+
+ @Override
+ public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
+ //username参数,是在登陆时,用户传递的表单数据username
+ //主要读取数据库3个值 username password authorities
+ User user= userMapper.selectByUsername(username);
+ if (user == null) {
+ throw new UsernameNotFoundException("用户名未找到");
+ }
+
+ String authorityName = user.getRole();
+ //为了返回一个UserDetails 使用User
+ List<GrantedAuthority> authorities = new ArrayList<>();
+ GrantedAuthority authority = new SimpleGrantedAuthority(authorityName);
+ authorities.add(authority);
+ return new org.springframework.security.core.userdetails.User(
+ user.getUsername(),
+ user.getPassword(),
+ true, // accountEnabled
+ true, // accountNonExpired
+ true, // credentialsNonExpired
+ true, // accountNonLocked
+ AuthorityUtils.createAuthorityList("ROLE_USER") // 设置用户的角色或权限
+ );
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/com/example/myproject/service/serviceImpl/UserServiceImpl.java b/src/main/java/com/example/myproject/service/serviceImpl/UserServiceImpl.java
new file mode 100644
index 0000000..d0718fe
--- /dev/null
+++ b/src/main/java/com/example/myproject/service/serviceImpl/UserServiceImpl.java
@@ -0,0 +1,122 @@
+
+package com.example.myproject.service.serviceImpl;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.example.myproject.mapper.UserMapper;
+import com.example.myproject.mapper.VerificationTokenMapper;
+import com.example.myproject.entity.User;
+import com.example.myproject.entity.VerificationToken;
+import com.example.myproject.service.EmailService;
+import com.example.myproject.service.UserService;
+import org.apache.commons.lang3.RandomStringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.crypto.password.PasswordEncoder;
+import org.springframework.stereotype.Service;
+import java.time.Instant;
+import java.time.temporal.ChronoUnit;
+//登录注册
+@Service
+public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {
+ private static final Logger log = LoggerFactory.getLogger(UserServiceImpl.class);
+ @Autowired
+ private UserMapper userMapper; // Using MyBatis-Plus mapper
+ @Autowired
+ private EmailServiceImpl emailService;
+ @Autowired
+ private VerificationTokenMapper verificationTokenMapper; // Using MyBatis-Plus mapper
+ @Autowired
+ private PasswordEncoder passwordEncoder; // Injecting password encoder
+ @Override
+ public User loginService(String username, String password) {
+ log.debug("Attempting login with username: {}, password: {}", username, password);
+ User user = userMapper.selectOne(new QueryWrapper<User>().eq("username", username).eq("password", password));
+ if (user != null) {
+ user.setPassword(""); // Clear the password before returning
+ log.debug("Login successful, User ID: {}", user.getId());
+ } else {
+ log.debug("Login failed, incorrect username or password.");
+ }
+ return user;
+ }
+ @Override
+ public boolean preRegisterUser(User user) {
+ log.debug("Pre-registering user, username: {}, email: {}", user.getUsername(), user.getEmail());
+ // 检查用户名或邮箱是否已存在
+ boolean userExists = userMapper.selectOne(new QueryWrapper<User>().eq("username", user.getUsername())) != null ||
+ userMapper.selectOne(new QueryWrapper<User>().eq("email", user.getEmail())) != null;
+ if (userExists) {
+ log.debug("Pre-registration failed, username or email already exists.");
+ return false; // 用户名或邮箱已经存在
+ }
+ // 加密密码
+ String encryptedPassword = passwordEncoder.encode(user.getPassword());
+ // 生成验证码
+ String token = RandomStringUtils.randomNumeric(6);
+ // 设置过期时间为当前时间加一小时
+ Instant expiryDate = Instant.now().plus(1, ChronoUnit.HOURS);
+ // 创建验证令牌对象
+ VerificationToken verificationToken = new VerificationToken(
+ token,
+ user.getUsername(),
+ user.getEmail(),
+ encryptedPassword,
+ expiryDate
+ );
+ // 插入验证令牌
+ int rowsInserted = verificationTokenMapper.insert(verificationToken);
+ if (rowsInserted > 0) {
+ // 发送验证邮件
+ emailService.sendVerificationEmail(user.getEmail(), token);
+ log.debug("Pre-registration successful, verification code: {}, expiry date: {}", token, expiryDate);
+ return true; // 注册前验证成功
+ } else {
+ log.error("Failed to insert verification token into database.");
+ return false; // 如果插入验证令牌失败,返回失败
+ }
+ }
+ @Override
+ public boolean verifyEmail(String email, String token) {
+ log.debug("Verifying email, email: {}, token: {}", email, token);
+ VerificationToken verificationToken = verificationTokenMapper.selectOne(
+ new QueryWrapper<VerificationToken>().eq("token", token).eq("email", email)
+ );
+ if (verificationToken != null && !verificationToken.isExpired()) {
+ log.debug("Verification code is valid, username: {}", verificationToken.getUsername());
+ User user = userMapper.selectOne(new QueryWrapper<User>().eq("email", email));
+ if (user == null) {
+ user = new User();
+ user.setEmail(email);
+ user.setUsername(verificationToken.getUsername());
+ user.setPassword(verificationToken.getPassword());
+ user.setEmailVerified(true);
+ userMapper.insert(user); // Save new user
+ log.debug("New user created, User ID: {}", user.getId());
+ } else {
+ user.setEmailVerified(true);
+ userMapper.updateById(user); // Update existing user
+ log.debug("User email verified, User ID: {}", user.getId());
+ }
+ verificationTokenMapper.delete(new QueryWrapper<VerificationToken>().eq("token", token)); // Clean up the token
+ log.debug("Verification code deleted.");
+ return true;
+ }
+ log.debug("Verification code is invalid or expired.");
+ return false;
+ }
+ public boolean checkEmailExists(String email) {
+ log.debug("检查邮箱是否存在,邮箱:{}", email);
+ boolean exists = userMapper.selectCount(new QueryWrapper<User>().eq("email", email)) > 0;
+ log.debug("邮箱存在状态:{}", exists);
+ return exists;
+ }
+ public boolean checkPassword(Long userId, String password) {
+ User user = userMapper.selectById(userId);
+ if (user == null) {
+ throw new RuntimeException("用户不存在");
+ }
+ String encryptedPassword = user.getPassword();
+ return passwordEncoder.matches(password, encryptedPassword);
+ }
+}