1.建表
CREATE TABLE `user` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`username` varchar(20) NOT NULL COMMENT '用户名',
`age` int(3) NOT NULL COMMENT '年龄',
`phone_number` varchar(20) DEFAULT NULL COMMENT '联系电话',
`create_time` datetime NOT NULL COMMENT '创建时间',
`create_by` varchar(20) NOT NULL COMMENT '创建人',
`update_time` datetime NOT NULL COMMENT '更新时间',
`update_by` varchar(20) NOT NULL COMMENT '更新人',
`password` varchar(100) DEFAULT NULL COMMENT '密码',
`description` varchar(100) DEFAULT NULL COMMENT '描述',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8
2. Java代码
项目结构如下
2.1 pom文件
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.5.RELEASE</version>
<relativePath/>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>jpa</artifactId>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>2.9.2</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>2.9.2</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
</dependencies>
</project>
2.2 配置文件
server:
port: 8007
spring:
application:
name: jpa-service
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/jpa?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf-8
username: root
password: root
2.3启动类
package com.test.jpa;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.data.jpa.repository.config.EnableJpaAuditing;
import springfox.documentation.swagger2.annotations.EnableSwagger2;
/**
* @author清梦
* @site www.xiaomage.com
* @company xxx公司
* @create 2023-03-13 14:02
*/
@SpringBootApplication
@EnableJpaAuditing
@EnableSwagger2
public class JpaApplication {
public static void main(String[] args) {
SpringApplication.run(JpaApplication.class,args);
}
}
2.4 通用属性类
package com.test.jpa.entity;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import org.springframework.data.annotation.CreatedBy;
import org.springframework.data.annotation.CreatedDate;
import org.springframework.data.annotation.LastModifiedBy;
import org.springframework.data.annotation.LastModifiedDate;
import org.springframework.data.jpa.domain.support.AuditingEntityListener;
import org.springframework.lang.Nullable;
import javax.persistence.*;
import java.io.Serializable;
import java.util.Date;
/**
* @author清梦
* @site www.xiaomage.com
* @company xxx公司
* @create 2023-03-13 14:13
*/
@MappedSuperclass
@EntityListeners(AuditingEntityListener.class)
@Data
public abstract class AbstractEntity implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@CreatedDate
@Column(name = "create_time",updatable = false)
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone="GMT+8")
private @Nullable
Date createTime;
@CreatedBy
@Column(name = "create_by",updatable = false)
private @Nullable
String createBy;
@LastModifiedDate
@Column(name = "update_time")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone="GMT+8")
private @Nullable
Date updateTime;
@LastModifiedBy
@Column(name = "update_by")
private @Nullable
String updateBy;
}
2.5 用户实体类
package com.test.jpa.entity;
import lombok.Data;
import javax.persistence.Entity;
import javax.persistence.Table;
/**
* @author清梦
* @site www.xiaomage.com
* @company xxx公司
* @create 2023-03-13 14:11
*/
@Data
@Entity
@Table(name = "user")
public class User extends AbstractEntity{
private String username;
private String password;
private String description;
private Integer age;
private String phoneNumber;
}
2.6 mapper
package com.test.jpa.mapper;
import com.test.jpa.entity.User;
import org.springframework.data.repository.PagingAndSortingRepository;
import org.springframework.stereotype.Repository;
/**
* @author清梦
* @site www.xiaomage.com
* @company xxx公司
* @create 2023-03-13 15:04
*/
@Repository
public interface UserMapper extends PagingAndSortingRepository<User,Long> {
User findByUsername(String username);
}
2.7 service
package com.test.jpa.service;
import com.test.jpa.entity.User;
import org.springframework.http.ResponseEntity;
/**
* @author清梦
* @site www.xiaomage.com
* @company xxx公司
* @create 2023-03-13 15:04
*/
public interface UserService {
ResponseEntity findAll();
ResponseEntity save(User user);
ResponseEntity delete(Long id);
}
2.8 用户实现类
package com.test.jpa.service.impl;
import com.test.jpa.entity.User;
import com.test.jpa.mapper.UserMapper;
import com.test.jpa.service.UserService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.authority.AuthorityUtils;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.stereotype.Service;
import java.util.List;
/**
* @author清梦
* @site www.xiaomage.com
* @company xxx公司
* @create 2023-03-13 15:05
*/
@Slf4j
@Service
public class UserServiceImpl implements UserService, UserDetailsService {
@Autowired
private UserMapper userMapper;
@Override
public ResponseEntity findAll() {
return ResponseEntity.ok(userMapper.findAll());
}
@Override
public ResponseEntity save(User user) {
String password = user.getPassword();
user.setPassword(new BCryptPasswordEncoder().encode(password));
User save = userMapper.save(user);
return ResponseEntity.ok(save);
}
@Override
public ResponseEntity delete(Long id) {
userMapper.deleteById(id);
return ResponseEntity.ok("删除成功");
}
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
User user = userMapper.findByUsername(username);
if (null == user){
throw new UsernameNotFoundException("账号或密码错误");
}
List<GrantedAuthority> authorities = AuthorityUtils.createAuthorityList("admin");
return new org.springframework.security.core.userdetails.User(username,new BCryptPasswordEncoder().encode(user.getPassword()),authorities);
}
}
2.9 security配置
package com.test.jpa.configuration;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;
import javax.annotation.Resource;
/**
* @author清梦
* @site www.xiaomage.com
* @company xxx公司
* @create 2023-03-14 10:43
*/
@Configuration
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {
@Resource
private UserDetailsService userDetailsService;
@Bean
PasswordEncoder getPasswordEncoder(){
return new BCryptPasswordEncoder();
}
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.userDetailsService(userDetailsService).passwordEncoder(getPasswordEncoder());
}
@Override
protected void configure(HttpSecurity http) throws Exception {
http.cors().and().csrf().disable()
.authorizeRequests()
.anyRequest().permitAll();
}
}
注意:我没有写登录页面,所以设置了所有请求都可以通过
2.10 获取当前登陆人,保存数据时自动注入
package com.test.jpa.component;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.domain.AuditorAware;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContextHolder;
import java.util.Optional;
/**
* @author清梦
* @site www.xiaomage.com
* @company xxx公司
* @create 2023-03-14 13:38
*/
@Configuration
public class SpringSecurityAuditorAware implements AuditorAware<String> {
@Override
public Optional<String> getCurrentAuditor() {
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
return Optional.of(authentication.getPrincipal().toString());
}
}
启动服务,进入浏览器输入http://localhost:8007/swagger-ui.html,进入页面如下
进入用户接口,可进行相应操作
因为我没有登录,所以默认为anonymousUser。
数据库记录如下
用户3是未实现自动注入前手动输入,密码123456是未使用加密前手动输入。