SpringBoot利用security、jwt、redis、MySQL、mybatis、JavaEmail分层controller、service、mapper、util实现用户通过邮箱找回密码的功能的具体代码和各个类的分析
时间: 2023-09-25 22:11:25 浏览: 95
SpringBoot集成SpringSecurity,数据层用MybatisPlus,拥有用户注册,登录,修改密码等.zip
5星 · 资源好评率100%
以下是基于SpringBoot利用security、jwt、redis、MySQL、mybatis、JavaEmail分层controller、service、mapper、util实现用户通过邮箱找回密码的功能的一个简单实现,包括代码和类的分析。
首先,我们需要在pom.xml文件中添加所需的依赖包:
```xml
<dependencies>
<!-- SpringBoot相关依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<!-- JWT相关依赖 -->
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-api</artifactId>
<version>0.11.2</version>
</dependency>
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-impl</artifactId>
<version>0.11.2</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-jackson</artifactId>
<version>0.11.2</version>
<scope>runtime</scope>
</dependency>
<!-- MySQL和MyBatis相关依赖 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.23</version>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.2.0</version>
</dependency>
<!-- JavaEmail相关依赖 -->
<dependency>
<groupId>com.sun.mail</groupId>
<artifactId>javax.mail</artifactId>
<version>1.6.2</version>
</dependency>
</dependencies>
```
接下来,创建一个User实体类,用于表示用户信息:
```java
public class User {
private Long id;
private String username;
private String password;
private String email;
// getter和setter方法省略
}
```
然后,创建一个UserMapper接口,用于定义对用户信息的CRUD操作:
```java
@Mapper
public interface UserMapper {
void addUser(User user);
User getUserByUsername(String username);
void updateUser(User user);
}
```
在这里,我们使用了注解@Mapper来标识该接口为MyBatis的Mapper接口,用于与数据库进行交互。addUser方法用于添加用户信息,getUserByUsername方法用于根据用户名获取用户信息,updateUser方法用于更新用户信息。
接下来,创建一个UserService接口,用于定义用户相关的服务操作:
```java
public interface UserService {
void register(User user);
String login(String username, String password);
void forgotPassword(String email);
void resetPassword(String token, String newPassword);
}
```
在这里,我们定义了register方法用于用户注册,login方法用于用户登录,forgotPassword方法用于用户忘记密码时通过邮箱找回密码,resetPassword方法用于重置密码。
实现UserService接口:
```java
@Service
public class UserServiceImpl implements UserService {
private static final Logger LOGGER = LoggerFactory.getLogger(UserServiceImpl.class);
@Autowired
private UserMapper userMapper;
@Autowired
private RedisTemplate<String, String> redisTemplate;
@Autowired
private JavaMailSender mailSender;
@Value("${spring.mail.username}")
private String sender;
@Override
public void register(User user) {
// 密码加密
String encodedPassword = new BCryptPasswordEncoder().encode(user.getPassword());
user.setPassword(encodedPassword);
userMapper.addUser(user);
}
@Override
public String login(String username, String password) {
// 根据用户名获取用户信息
User user = userMapper.getUserByUsername(username);
// 判断用户是否存在
if (user == null) {
return null;
}
// 判断密码是否正确
if (new BCryptPasswordEncoder().matches(password, user.getPassword())) {
// 生成JWT
String token = Jwts.builder()
.setSubject(username)
.setExpiration(new Date(System.currentTimeMillis() + 60 * 60 * 1000)) // 设置过期时间为1小时
.signWith(SignatureAlgorithm.HS512, "secret")
.compact();
return token;
} else {
return null;
}
}
@Override
public void forgotPassword(String email) {
// 根据邮箱获取用户信息
User user = userMapper.getUserByEmail(email);
// 判断用户是否存在
if (user == null) {
return;
}
// 生成重置密码的token
String token = UUID.randomUUID().toString();
// 将token保存到Redis中,并设置过期时间为10分钟
redisTemplate.opsForValue().set(token, user.getUsername(), 10, TimeUnit.MINUTES);
// 构建邮件内容
String resetUrl = "http://localhost:8080/reset?token=" + token;
String emailContent = "请点击以下链接重置您的密码:" + resetUrl;
// 发送邮件
SimpleMailMessage message = new SimpleMailMessage();
message.setFrom(sender);
message.setTo(email);
message.setSubject("重置密码");
message.setText(emailContent);
mailSender.send(message);
LOGGER.info("已向邮箱" + email + "发送重置密码邮件");
}
@Override
public void resetPassword(String token, String newPassword) {
// 根据token从Redis中获取用户名
String username = redisTemplate.opsForValue().get(token);
// 判断用户名是否存在
if (username == null) {
return;
}
// 根据用户名获取用户信息
User user = userMapper.getUserByUsername(username);
// 判断用户是否存在
if (user == null) {
return;
}
// 修改用户密码
user.setPassword(new BCryptPasswordEncoder().encode(newPassword));
userMapper.updateUser(user);
// 删除Redis中的token
redisTemplate.delete(token);
}
}
```
在这里,我们使用了注解@Service来标识该类为服务类,用于实现UserService接口中定义的各个方法。在register方法中,我们对用户密码进行了加密,并调用UserMapper中的addUser方法保存用户信息。在login方法中,我们根据用户名获取用户信息,并判断密码是否正确,如果正确则生成JWT并返回。在forgotPassword方法中,我们根据邮箱获取用户信息,生成重置密码的token并保存到Redis中,然后构建邮件内容并发送邮件。在resetPassword方法中,我们根据token从Redis中获取用户名,根据用户名获取用户信息,并修改用户密码并保存。
接下来,创建一个UserController类,用于定义用户相关的API接口:
```java
@RestController
public class UserController {
@Autowired
private UserService userService;
@PostMapping("/register")
public void register(@RequestBody User user) {
userService.register(user);
}
@PostMapping("/login")
public String login(@RequestParam String username, @RequestParam String password) {
return userService.login(username, password);
}
@PostMapping("/forgotPassword")
public void forgotPassword(@RequestParam String email) {
userService.forgotPassword(email);
}
@PostMapping("/resetPassword")
public void resetPassword(@RequestParam String token, @RequestParam String newPassword) {
userService.resetPassword(token, newPassword);
}
}
```
在这里,我们使用了注解@RestController来标识该类为控制器类,用于定义API接口。在register方法中,我们接收一个User对象作为参数并调用UserService中的register方法。在login方法中,我们接收用户名和密码作为参数并调用UserService中的login方法。在forgotPassword方法中,我们接收邮箱作为参数并调用UserService中的forgotPassword方法。在resetPassword方法中,我们接收token和新密码作为参数并调用UserService中的resetPassword方法。
最后,我们需要在application.properties文件中添加所需的配置信息:
```properties
spring.datasource.url=jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
mybatis.mapper-locations=classpath:mapper/*.xml
mybatis.type-aliases-package=com.example.demo.entity
spring.redis.host=localhost
spring.redis.port=6379
spring.redis.password=
spring.mail.host=smtp.qq.com
spring.mail.port=587
spring.mail.username=yourusername@qq.com
spring.mail.password=yourpassword
spring.mail.default-encoding=UTF-8
spring.mail.properties.mail.smtp.auth=true
spring.mail.properties.mail.smtp.starttls.enable=true
```
在这里,我们配置了MySQL、MyBatis、Redis、JavaEmail等相关信息。
到此,我们就完成了基于SpringBoot利用security、jwt、redis、MySQL、mybatis、JavaEmail分层controller、service、mapper、util实现用户通过邮箱找回密码的功能的一个简单实现。
阅读全文