[UPDATE] refreshToken

main
bjkim 11 months ago
parent b96f5f9ceb
commit 5b9532eb88

@ -2,27 +2,24 @@
# https://docs.gradle.org/current/userguide/platforms.html#sub::toml-dependencies-format # https://docs.gradle.org/current/userguide/platforms.html#sub::toml-dependencies-format
[versions] [versions]
com-mysql-mysql-connector-j = "8.0.33"
io-jsonwebtoken-jjwt-api = "0.11.5" io-jsonwebtoken-jjwt-api = "0.11.5"
io-jsonwebtoken-jjwt-impl = "0.11.5" io-jsonwebtoken-jjwt-impl = "0.11.5"
io-jsonwebtoken-jjwt-jackson = "0.11.5" io-jsonwebtoken-jjwt-jackson = "0.11.5"
org-mariadb-jdbc-mariadb-java-client = "3.1.4" org-mariadb-jdbc-mariadb-java-client = "3.1.4"
org-projectlombok-lombok = "1.18.26" org-projectlombok-lombok = "1.18.26"
org-springdoc-springdoc-openapi-starter-webmvc-ui = "2.1.0" org-springdoc-springdoc-openapi-starter-webmvc-ui = "2.8.9"
org-springframework-boot-spring-boot-starter-data-jpa = "3.1.0" org-springframework-boot-spring-boot-starter-data-jpa = "3.5.3"
org-springframework-boot-spring-boot-starter-security = "3.1.0" org-springframework-boot-spring-boot-starter-security = "3.5.3"
org-springframework-boot-spring-boot-starter-test = "3.1.0" org-springframework-boot-spring-boot-starter-test = "3.5.3"
org-springframework-boot-spring-boot-starter-validation = "3.1.0" org-springframework-boot-spring-boot-starter-validation = "3.5.3"
org-springframework-boot-spring-boot-starter-web = "3.1.0" org-springframework-boot-spring-boot-starter-web = "3.5.3"
org-springframework-security-spring-security-test = "6.1.0" org-springframework-security-spring-security-test = "6.1.0"
[libraries] [libraries]
com-mysql-mysql-connector-j = { module = "com.mysql:mysql-connector-j", version.ref = "com-mysql-mysql-connector-j" }
io-jsonwebtoken-jjwt-api = { module = "io.jsonwebtoken:jjwt-api", version.ref = "io-jsonwebtoken-jjwt-api" } io-jsonwebtoken-jjwt-api = { module = "io.jsonwebtoken:jjwt-api", version.ref = "io-jsonwebtoken-jjwt-api" }
io-jsonwebtoken-jjwt-impl = { module = "io.jsonwebtoken:jjwt-impl", version.ref = "io-jsonwebtoken-jjwt-impl" } io-jsonwebtoken-jjwt-impl = { module = "io.jsonwebtoken:jjwt-impl", version.ref = "io-jsonwebtoken-jjwt-impl" }
io-jsonwebtoken-jjwt-jackson = { module = "io.jsonwebtoken:jjwt-jackson", version.ref = "io-jsonwebtoken-jjwt-jackson" } io-jsonwebtoken-jjwt-jackson = { module = "io.jsonwebtoken:jjwt-jackson", version.ref = "io-jsonwebtoken-jjwt-jackson" }
org-mariadb-jdbc-mariadb-java-client = { module = "org.mariadb.jdbc:mariadb-java-client", version.ref = "org-mariadb-jdbc-mariadb-java-client" } org-mariadb-jdbc-mariadb-java-client = { module = "org.mariadb.jdbc:mariadb-java-client", version.ref = "org-mariadb-jdbc-mariadb-java-client" }
org-projectlombok-lombok = { module = "org.projectlombok:lombok", version.ref = "org-projectlombok-lombok" }
org-springdoc-springdoc-openapi-starter-webmvc-ui = { module = "org.springdoc:springdoc-openapi-starter-webmvc-ui", version.ref = "org-springdoc-springdoc-openapi-starter-webmvc-ui" } org-springdoc-springdoc-openapi-starter-webmvc-ui = { module = "org.springdoc:springdoc-openapi-starter-webmvc-ui", version.ref = "org-springdoc-springdoc-openapi-starter-webmvc-ui" }
org-springframework-boot-spring-boot-starter-data-jpa = { module = "org.springframework.boot:spring-boot-starter-data-jpa", version.ref = "org-springframework-boot-spring-boot-starter-data-jpa" } org-springframework-boot-spring-boot-starter-data-jpa = { module = "org.springframework.boot:spring-boot-starter-data-jpa", version.ref = "org-springframework-boot-spring-boot-starter-data-jpa" }
org-springframework-boot-spring-boot-starter-security = { module = "org.springframework.boot:spring-boot-starter-security", version.ref = "org-springframework-boot-spring-boot-starter-security" } org-springframework-boot-spring-boot-starter-security = { module = "org.springframework.boot:spring-boot-starter-security", version.ref = "org-springframework-boot-spring-boot-starter-security" }

@ -1,106 +0,0 @@
<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.1.0</version>
<relativePath /> <!-- lookup parent from repository -->
</parent>
<groupId>com.bezkoder</groupId>
<artifactId>autoflow</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>spring-security-refresh-token</name>
<description>Spring Security Refresh Token with JWT example in Spring Boot</description>
<properties>
<java.version>17</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</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-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-api</artifactId>
<version>0.11.5</version>
</dependency>
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-impl</artifactId>
<version>0.11.5</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-jackson</artifactId>
<version>0.11.5</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.mariadb.jdbc</groupId>
<artifactId>mariadb-java-client</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.springdoc</groupId>
<artifactId>springdoc-openapi-starter-webmvc-ui</artifactId>
<version>2.1.0</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>

@ -1,33 +1,15 @@
package kr.re.etri.security.jwt.advice; package kr.re.etri.security.jwt.advice;
import lombok.AllArgsConstructor;
import lombok.Getter;
import java.util.Date; import java.util.Date;
@Getter
@AllArgsConstructor
public class ErrorMessage { public class ErrorMessage {
private int statusCode; private int statusCode;
private Date timestamp; private Date timestamp;
private String message; private String message;
private String description; private String description;
public ErrorMessage(int statusCode, Date timestamp, String message, String description) {
this.statusCode = statusCode;
this.timestamp = timestamp;
this.message = message;
this.description = description;
}
public int getStatusCode() {
return statusCode;
}
public Date getTimestamp() {
return timestamp;
}
public String getMessage() {
return message;
}
public String getDescription() {
return description;
}
} }

@ -3,9 +3,18 @@ package kr.re.etri.security.jwt.models;
import java.time.Instant; import java.time.Instant;
import jakarta.persistence.*; import jakarta.persistence.*;
import lombok.Getter;
@Entity(name = "refreshtoken") import lombok.Setter;
import lombok.NoArgsConstructor;
import org.hibernate.annotations.Comment;
@Comment("새로고침 토큰")
@Entity(name = "tb_refreshtoken")
@Getter
@Setter
@NoArgsConstructor
public class RefreshToken { public class RefreshToken {
@Id @Id
@GeneratedValue(strategy = GenerationType.AUTO) @GeneratedValue(strategy = GenerationType.AUTO)
private long id; private long id;
@ -19,40 +28,4 @@ public class RefreshToken {
@Column(nullable = false) @Column(nullable = false)
private Instant expiryDate; private Instant expiryDate;
public RefreshToken() {
}
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
public String getToken() {
return token;
}
public void setToken(String token) {
this.token = token;
}
public Instant getExpiryDate() {
return expiryDate;
}
public void setExpiryDate(Instant expiryDate) {
this.expiryDate = expiryDate;
}
} }

@ -1,39 +1,32 @@
package kr.re.etri.security.jwt.models; package kr.re.etri.security.jwt.models;
import jakarta.persistence.*; import jakarta.persistence.*;
import lombok.Getter;
import lombok.Setter;
import lombok.NoArgsConstructor;
import lombok.AllArgsConstructor;
import org.hibernate.annotations.Comment;
@Entity @Entity
@Table(name = "roles") @Table(name = "tb_role")
@Comment("역할")
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
public class Role { public class Role {
@Id @Id
@GeneratedValue(strategy = GenerationType.IDENTITY) @GeneratedValue(strategy = GenerationType.IDENTITY)
@Comment("아이디")
private Integer id; private Integer id;
@Enumerated(EnumType.STRING) @Enumerated(EnumType.STRING)
@Column(length = 20) @Column(length = 20)
@Comment("이름")
private ERole name; private ERole name;
public Role() {
}
public Role(ERole name) { public Role(ERole name) {
this.name = name; this.name = name;
} }
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public ERole getName() {
return name;
}
public void setName(ERole name) {
this.name = name;
}
} }

@ -7,20 +7,33 @@ import jakarta.persistence.*;
import jakarta.validation.constraints.Email; import jakarta.validation.constraints.Email;
import jakarta.validation.constraints.NotBlank; import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.Size; import jakarta.validation.constraints.Size;
import lombok.Getter;
import lombok.Setter;
import lombok.NoArgsConstructor;
import lombok.AllArgsConstructor;
import org.hibernate.annotations.Comment;
@Entity @Entity
@Table(name = "users", @Comment("유저")
uniqueConstraints = { @Table(name = "tb_user",
@UniqueConstraint(columnNames = "username"), uniqueConstraints = {
@UniqueConstraint(columnNames = "email") @UniqueConstraint(columnNames = "username"),
}) @UniqueConstraint(columnNames = "email")
})
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
public class User { public class User {
@Id @Id
@GeneratedValue(strategy = GenerationType.IDENTITY) @GeneratedValue(strategy = GenerationType.IDENTITY)
@Comment("아이디")
private Long id; private Long id;
@NotBlank @NotBlank
@Size(max = 20) @Size(max = 20)
@Comment("유저이름")
private String username; private String username;
@NotBlank @NotBlank
@ -34,56 +47,13 @@ public class User {
@ManyToMany(fetch = FetchType.LAZY) @ManyToMany(fetch = FetchType.LAZY)
@JoinTable(name = "user_roles", @JoinTable(name = "user_roles",
joinColumns = @JoinColumn(name = "user_id"), joinColumns = @JoinColumn(name = "user_id"),
inverseJoinColumns = @JoinColumn(name = "role_id")) inverseJoinColumns = @JoinColumn(name = "role_id"))
private Set<Role> roles = new HashSet<>(); private Set<Role> roles = new HashSet<>();
public User() {
}
public User(String username, String email, String password) { public User(String username, String email, String password) {
this.username = username; this.username = username;
this.email = email; this.email = email;
this.password = password; this.password = password;
} }
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public Set<Role> getRoles() {
return roles;
}
public void setRoles(Set<Role> roles) {
this.roles = roles;
}
} }

@ -1,27 +1,16 @@
package kr.re.etri.security.jwt.payload.request; package kr.re.etri.security.jwt.payload.request;
import jakarta.validation.constraints.NotBlank; import jakarta.validation.constraints.NotBlank;
import lombok.Getter;
import lombok.Setter;
@Getter
@Setter
public class LoginRequest { public class LoginRequest {
@NotBlank @NotBlank
private String username; private String username;
@NotBlank @NotBlank
private String password; private String password;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
} }

@ -1,17 +1,12 @@
package kr.re.etri.security.jwt.payload.response; package kr.re.etri.security.jwt.payload.response;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.Setter;
@Getter
@Setter
@AllArgsConstructor
public class MessageResponse { public class MessageResponse {
private String message; private String message;
public MessageResponse(String message) {
this.message = message;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
} }

@ -1,45 +1,17 @@
package kr.re.etri.security.jwt.payload.response; package kr.re.etri.security.jwt.payload.response;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.Setter;
import java.util.List; import java.util.List;
@Getter
@Setter
@AllArgsConstructor
public class UserInfoResponse { public class UserInfoResponse {
private Long id; private Long id;
private String username; private String username;
private String email; private String email;
private List<String> roles; private List<String> roles;
public UserInfoResponse(Long id, String username, String email, List<String> roles) {
this.id = id;
this.username = username;
this.email = email;
this.roles = roles;
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public List<String> getRoles() {
return roles;
}
} }

@ -7,6 +7,7 @@ import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse; import jakarta.servlet.http.HttpServletResponse;
import lombok.extern.slf4j.Slf4j;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
@ -18,6 +19,7 @@ import org.springframework.web.filter.OncePerRequestFilter;
import kr.re.etri.security.jwt.security.services.UserDetailsServiceImpl; import kr.re.etri.security.jwt.security.services.UserDetailsServiceImpl;
@Slf4j
public class AuthTokenFilter extends OncePerRequestFilter { public class AuthTokenFilter extends OncePerRequestFilter {
@Autowired @Autowired
private JwtUtils jwtUtils; private JwtUtils jwtUtils;
@ -25,7 +27,6 @@ public class AuthTokenFilter extends OncePerRequestFilter {
@Autowired @Autowired
private UserDetailsServiceImpl userDetailsService; private UserDetailsServiceImpl userDetailsService;
private static final Logger logger = LoggerFactory.getLogger(AuthTokenFilter.class);
@Override @Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)

@ -8,7 +8,7 @@ spring.jpa.hibernate.ddl-auto= create-drop
# App Properties # App Properties
bezkoder.app.jwtCookieName= bezkoder-jwt bezkoder.app.jwtCookieName= bezkoder-jwt
bezkoder.app.jwtRefreshCookieName= bezkoder-jwt-refresh bezkoder.app.jwtRefreshCookieName= bezkoder-jwt-refresh
bezkoder.app.jwtSecret= ======================BezKoder=Spring=========================== bezkoder.app.jwtSecret= 275511b31c520562d69802ce4a913773102563891563a24062f44b3f312ca2bd034440e81836d1b4ccf4195f43db4c81a4e489a41f1ae0967afe468c9a361f4d
#bezkoder.app.jwtExpirationMs= 86400000 #bezkoder.app.jwtExpirationMs= 86400000
#bezkoder.app.jwtRefreshExpirationMs= 86400000 #bezkoder.app.jwtRefreshExpirationMs= 86400000

Loading…
Cancel
Save