update
This commit is contained in:
4
pom.xml
4
pom.xml
@@ -59,6 +59,10 @@
|
||||
</exclusion>
|
||||
</exclusions>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.flywaydb</groupId>
|
||||
<artifactId>flyway-core</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.springframework.security</groupId>
|
||||
<artifactId>spring-security-test</artifactId>
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
package com.example.vue.config;
|
||||
|
||||
import com.example.vue.security.UserDetailsAuthenticationProvider;
|
||||
import com.example.vue.config.security.UserDetailsAuthenticationProvider;
|
||||
import com.example.vue.domain.user.UserDetailsServiceImpl;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import org.springframework.context.annotation.Bean;
|
||||
@@ -31,6 +31,7 @@ public class SecurityConfiguration extends WebSecurityConfigurerAdapter {
|
||||
protected void configure(HttpSecurity http) throws Exception {
|
||||
|
||||
http.cors().disable()
|
||||
.csrf().disable()
|
||||
.authorizeRequests()
|
||||
.antMatchers("/auth/login").permitAll()
|
||||
.antMatchers("/auth/register").permitAll()
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
package com.example.vue.security;
|
||||
package com.example.vue.config.security;
|
||||
|
||||
import com.example.vue.domain.user.UserDetailsServiceImpl;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
@@ -0,0 +1,28 @@
|
||||
package com.example.vue.domain.auth;
|
||||
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import org.springframework.web.bind.annotation.PostMapping;
|
||||
import org.springframework.web.bind.annotation.RequestBody;
|
||||
import org.springframework.web.bind.annotation.RequestMapping;
|
||||
import org.springframework.web.bind.annotation.RestController;
|
||||
|
||||
import javax.validation.Valid;
|
||||
|
||||
@RestController
|
||||
@RequestMapping(value = "/auth")
|
||||
@RequiredArgsConstructor
|
||||
public class AuthController {
|
||||
|
||||
private final AuthService authService;
|
||||
|
||||
@PostMapping(value = "/login")
|
||||
public LoginResponseDto login(@RequestBody @Valid LoginRequestDto loginRequestDto) {
|
||||
authService.login(loginRequestDto);
|
||||
return null;
|
||||
}
|
||||
|
||||
@PostMapping(value = "/register")
|
||||
public void register() {
|
||||
|
||||
}
|
||||
}
|
||||
14
src/main/java/com/example/vue/domain/auth/AuthException.java
Normal file
14
src/main/java/com/example/vue/domain/auth/AuthException.java
Normal file
@@ -0,0 +1,14 @@
|
||||
package com.example.vue.domain.auth;
|
||||
|
||||
import org.springframework.http.HttpStatus;
|
||||
import org.springframework.web.bind.annotation.ResponseStatus;
|
||||
|
||||
public class AuthException {
|
||||
|
||||
@ResponseStatus(HttpStatus.BAD_REQUEST)
|
||||
public static class NoExistEmail extends RuntimeException {
|
||||
public NoExistEmail(String email) {
|
||||
super("존재하지 않는 이메일입니다. [email=" + email + "]");
|
||||
}
|
||||
}
|
||||
}
|
||||
19
src/main/java/com/example/vue/domain/auth/AuthService.java
Normal file
19
src/main/java/com/example/vue/domain/auth/AuthService.java
Normal file
@@ -0,0 +1,19 @@
|
||||
package com.example.vue.domain.auth;
|
||||
|
||||
import com.example.vue.domain.user.UserRepository;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
@Service
|
||||
@RequiredArgsConstructor
|
||||
public class AuthService {
|
||||
|
||||
private final UserRepository userRepository;
|
||||
|
||||
public void login(LoginRequestDto loginRequestDto) {
|
||||
String email = loginRequestDto.getEmail();
|
||||
if (userRepository.findByEmail(email).size() < 1) {
|
||||
throw new AuthException.NoExistEmail(email);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,15 @@
|
||||
package com.example.vue.domain.auth;
|
||||
|
||||
import lombok.Data;
|
||||
|
||||
import javax.validation.constraints.NotNull;
|
||||
|
||||
@Data
|
||||
public class LoginRequestDto {
|
||||
|
||||
@NotNull
|
||||
private String email;
|
||||
|
||||
@NotNull
|
||||
private String password;
|
||||
}
|
||||
@@ -0,0 +1,8 @@
|
||||
package com.example.vue.domain.auth;
|
||||
|
||||
import lombok.Data;
|
||||
|
||||
@Data
|
||||
public class LoginResponseDto {
|
||||
private String token;
|
||||
}
|
||||
@@ -1,13 +1,28 @@
|
||||
package com.example.vue.domain.user;
|
||||
|
||||
import javax.persistence.Entity;
|
||||
import javax.persistence.GeneratedValue;
|
||||
import javax.persistence.Id;
|
||||
import org.springframework.data.annotation.CreatedDate;
|
||||
import org.springframework.data.annotation.LastModifiedDate;
|
||||
|
||||
import javax.persistence.*;
|
||||
import java.time.LocalDateTime;
|
||||
|
||||
@Entity
|
||||
@NamedQuery(name = "findByEmail", query = "select u from User u where u.email = :email")
|
||||
public class User {
|
||||
|
||||
@Id @GeneratedValue
|
||||
Long id;
|
||||
private Long id;
|
||||
|
||||
@Column(name = "email")
|
||||
private String email;
|
||||
|
||||
@Column(name = "name")
|
||||
private String name;
|
||||
|
||||
@CreatedDate
|
||||
private LocalDateTime createdAt;
|
||||
|
||||
@LastModifiedDate
|
||||
private LocalDateTime updatedAt;
|
||||
|
||||
}
|
||||
|
||||
@@ -3,7 +3,9 @@ package com.example.vue.domain.user;
|
||||
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;
|
||||
|
||||
@Service
|
||||
public class UserDetailsServiceImpl implements UserDetailsService {
|
||||
|
||||
@Override
|
||||
|
||||
@@ -4,6 +4,7 @@ import lombok.RequiredArgsConstructor;
|
||||
import org.springframework.stereotype.Repository;
|
||||
|
||||
import javax.persistence.EntityManager;
|
||||
import java.util.List;
|
||||
|
||||
@Repository
|
||||
@RequiredArgsConstructor
|
||||
@@ -16,4 +17,8 @@ public class UserRepository {
|
||||
return user;
|
||||
}
|
||||
|
||||
public List<User> findByEmail(String email) {
|
||||
return em.createNamedQuery("findByEmail", User.class).setParameter("email", email).getResultList();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -1,9 +1,12 @@
|
||||
spring.datasource.password=1111
|
||||
spring.datasource.username=root
|
||||
spring.datasource.url=jdbc:mysql://localhost:3307/blog?serverTimezone=Asia/Seoul
|
||||
|
||||
spring.jpa.show-sql=true
|
||||
spring.jpa.hibernate.ddl-auto=validate
|
||||
spring.jpa.hibernate.use-new-id-generator-mappings=false
|
||||
spring.jpa.properties.hibernate.format_sql=true
|
||||
|
||||
server.error.include-stacktrace=never
|
||||
|
||||
server.port=7070
|
||||
39
src/main/resources/db/migration/V1__init.sql
Normal file
39
src/main/resources/db/migration/V1__init.sql
Normal file
@@ -0,0 +1,39 @@
|
||||
CREATE TABLE user (
|
||||
id bigint unsigned NOT NULL AUTO_INCREMENT,
|
||||
created_at datetime(6) DEFAULT NULL,
|
||||
email varchar(255) DEFAULT NULL,
|
||||
password varchar(255) DEFAULT NULL,
|
||||
updated_at datetime(6) DEFAULT NULL,
|
||||
name varchar(255) DEFAULT NULL,
|
||||
|
||||
PRIMARY KEY (id)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
|
||||
|
||||
CREATE TABLE article (
|
||||
id bigint unsigned NOT NULL AUTO_INCREMENT,
|
||||
content varchar(255) DEFAULT NULL,
|
||||
created_at datetime(6) DEFAULT NULL,
|
||||
title varchar(255) DEFAULT NULL,
|
||||
updated_at datetime(6) DEFAULT NULL,
|
||||
user_id bigint unsigned DEFAULT NULL,
|
||||
|
||||
PRIMARY KEY (id),
|
||||
KEY fk_article_user_id (user_id),
|
||||
CONSTRAINT fk_article_user_id FOREIGN KEY (user_id) REFERENCES user (id)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
|
||||
|
||||
CREATE TABLE authority (
|
||||
id bigint unsigned NOT NULL AUTO_INCREMENT,
|
||||
user_id bigint unsigned NOT NULL,
|
||||
authority varchar(255) NOT NULL,
|
||||
|
||||
PRIMARY KEY (id),
|
||||
KEY fk_authority_user_id (user_id),
|
||||
CONSTRAINT fk_authority_user_id FOREIGN KEY (user_id) REFERENCES user (id)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
|
||||
|
||||
CREATE TABLE hibernate_sequence (
|
||||
next_val bigint unsigned DEFAULT NULL,
|
||||
sequence_name VARCHAR(255) NOT NULL
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
|
||||
|
||||
Reference in New Issue
Block a user