配置Mysql与注册登录模块 1

This commit is contained in:
flykhan 2023-02-19 15:00:08 +08:00
parent 26ecd689c4
commit 78db9a28c8
9 changed files with 277 additions and 2 deletions

View File

@ -16,7 +16,59 @@
<properties>
<java.version>1.8</java.version>
</properties>
<!-- dependencies 里面存放依赖-->
<dependencies>
<!-- JDBC 依赖,用于操作连接数据库-->
<!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-jdbc -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
<version>3.0.2</version>
</dependency>
<!-- 简化代码,可以帮助写一些构造函数, set() , get() 函数等-->
<!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.26</version>
<scope>provided</scope>
</dependency>
<!-- mysql 连接驱动-->
<!-- https://mvnrepository.com/artifact/com.mysql/mysql-connector-j -->
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
<version>8.0.32</version>
</dependency>
<!-- mybatis-plus 用于低代码开发-->
<!-- https://mvnrepository.com/artifact/com.baomidou/mybatis-plus-boot-starter -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.5.3.1</version>
</dependency>
<!-- mybatis-plus-generator 用于自动生成一些函数-->
<!-- https://mvnrepository.com/artifact/com.baomidou/mybatis-plus-generator -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-generator</artifactId>
<version>3.5.3.1</version>
</dependency>
<!-- 用于安全验证-->
<!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-security -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
<version>3.0.2</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>

View File

@ -0,0 +1,17 @@
package com.kob.backend.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;
//明文加密
@Configuration
@EnableWebSecurity
public class SecurityConfig {
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
}

View File

@ -0,0 +1,71 @@
package com.kob.backend.controller.user;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.kob.backend.mapper.UserMapper;
import com.kob.backend.pojo.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
//实现对用户类 User 的增删查操作
@RestController
public class UserController {
// 用到数据库里的 Mapper ,需要加 @Autowired 注解
@Autowired
UserMapper userMapper;
// 返回所有用户
@GetMapping("/user/all")
public List<User> getAll() {
// null 表示查询所有的
return userMapper.selectList(null);
}
/*
@GetMapping("/user/{userId}/")
public User getUser(@PathVariable int userId) {
// 查询某个用户
// return userMapper.selectById(userId);
// 封装查询语句:查询某个 id 的用户
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("id", userId);
return userMapper.selectOne(queryWrapper);
}
*/
@GetMapping("/user/{userId}")
public List<User> getUser(@PathVariable int userId) {
// 封装查询语句:查询某个范围 id 的用户: ge 是大于等于, gt 是大于, le 是小于等于, lt 是小于
QueryWrapper<User> queryWrapper1 = new QueryWrapper<>();
queryWrapper1.ge("id", 2).le("id", 4);
return userMapper.selectList(queryWrapper1);
}
@GetMapping("/user/add/{userId}/{username}/{password}")
public String addUser(@PathVariable int userId,
@PathVariable String username,
@PathVariable String password) {
if(password.length() < 6){
return "密码少于6位,请重设密码";
}
// 加密明文密码并存入密文到数据库
PasswordEncoder passwordEncoder = new BCryptPasswordEncoder();
String encodedPassword = passwordEncoder.encode(password);
User user = new User(userId, username, encodedPassword);
userMapper.insert(user);
return "Add User Successfully";
}
@GetMapping("/user/delete/{userId}")
public String deleteUser(@PathVariable int userId){
userMapper.deleteById(userId);
return "Delete User Successfully";
}
}

View File

@ -0,0 +1,11 @@
//用于将 class 的操作转化成 sql 语句
package com.kob.backend.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.kob.backend.pojo.User;
import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface UserMapper extends BaseMapper<User> {
}

View File

@ -0,0 +1,23 @@
//用于将 mysql User 转换为 class
package com.kob.backend.pojo;
/*
Data 用于编译时自动生成 getter setter 方法;
NoArgsConstructor 用于生成无参构造函数;
AllArgsConstructor 用于生成所有参数构造函数.
*/
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@NoArgsConstructor
@AllArgsConstructor
public class User {
// 使用对象类型定义而不是 Int 防止 Mybatis 报错
private Integer id;
private String username;
private String password;
}

View File

@ -0,0 +1,29 @@
package com.kob.backend.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.kob.backend.mapper.UserMapper;
import com.kob.backend.pojo.User;
import com.kob.backend.service.impl.utils.UserDetailsImpl;
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;
//自定义 Spring-Starter-Security 登录信息; @Autowired 需要在外层加入 @Service 注解
@Service
public class UserDetailsServiceImpl implements UserDetailsService {
@Autowired
private UserMapper userMapper;
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("username",username);
User user = userMapper.selectOne(queryWrapper);
if(user == null){
throw new RuntimeException("用户不存在");
}
return new UserDetailsImpl(user);
}
}

View File

@ -0,0 +1,61 @@
package com.kob.backend.service.impl.utils;
import com.kob.backend.pojo.User;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.userdetails.UserDetails;
import java.util.Collection;
//实现 UserDetails 接口:需要加上 lombok 的注解,来自动生成构造函数
@Data
@AllArgsConstructor
@NoArgsConstructor
public class UserDetailsImpl implements UserDetails {
// 定义一个 pojo User 类对象
private User user;
@Override
public Collection<? extends GrantedAuthority> getAuthorities() {
return null;
}
// 获取 pojo -> User 类对象 user 的用户密码
@Override
public String getPassword() {
return user.getPassword();
}
// 获取 pojo -> User 类对象 user 的用户名
@Override
public String getUsername() {
return user.getUsername();
}
// 用户账号是否没有过期
@Override
public boolean isAccountNonExpired() {
return true;
}
// 用户是否没有被锁定
@Override
public boolean isAccountNonLocked() {
return true;
}
// 用户授权是否没有过期
@Override
public boolean isCredentialsNonExpired() {
return true;
}
// 用户是否被启用
@Override
public boolean isEnabled() {
return true;
}
}

View File

@ -1,2 +1,8 @@
#??????
server.port=3000
#default server port
server.port=3000
#mysql database connect profile
spring.datasource.username=root
spring.datasource.password=mysqlPassword
spring.datasource.url=jdbc:mysql://localhost:3306/kob?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf-8
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

View File

@ -2,12 +2,17 @@ package com.kob.backend;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;
@SpringBootTest
class BackendApplicationTests {
// 测试明文加密
@Test
void contextLoads() {
PasswordEncoder passwordEncoder = new BCryptPasswordEncoder();
System.out.println(passwordEncoder.encode("123"));
}
}