@@ -10,7 +10,7 @@ plugins {
|
||||
id("org.springframework.boot") version "2.7.0"
|
||||
id("io.spring.dependency-management") version "1.0.11.RELEASE"
|
||||
kotlin("jvm") version "1.6.21"
|
||||
kotlin("plugin.spring") version "1.6.21" apply false
|
||||
kotlin("plugin.spring") version "1.6.21" apply false // TODO: apply false what?
|
||||
kotlin("plugin.jpa") version "1.6.21" apply false
|
||||
}
|
||||
|
||||
@@ -52,6 +52,7 @@ subprojects {
|
||||
implementation("org.springframework.boot:spring-boot-starter-data-jpa")
|
||||
implementation("org.springframework.boot:spring-boot-starter-web")
|
||||
implementation("org.springframework.boot:spring-boot-starter-validation")
|
||||
implementation("org.springframework.boot:spring-boot-starter-security")
|
||||
implementation("com.fasterxml.jackson.module:jackson-module-kotlin")
|
||||
developmentOnly("org.springframework.boot:spring-boot-devtools")
|
||||
|
||||
@@ -62,6 +63,7 @@ subprojects {
|
||||
// DB
|
||||
runtimeOnly("mysql:mysql-connector-java") // MySQL
|
||||
runtimeOnly("com.h2database:h2") // H2
|
||||
implementation("org.flywaydb:flyway-core:7.15.0") // flyway
|
||||
|
||||
// Logging
|
||||
// log4j2
|
||||
@@ -69,10 +71,9 @@ subprojects {
|
||||
// testImplementation("org.springframework.boot:spring-boot-starter-log4j2")
|
||||
implementation("io.github.microutils:kotlin-logging:2.1.21")
|
||||
|
||||
implementation("org.flywaydb:flyway-core:7.15.0") // flyway
|
||||
|
||||
// Test
|
||||
testImplementation("org.springframework.boot:spring-boot-starter-test")
|
||||
testImplementation("org.springframework.security:spring-security-test")
|
||||
}
|
||||
|
||||
tasks.withType<KotlinCompile> {
|
||||
|
||||
@@ -0,0 +1,27 @@
|
||||
package io.beaniejoy.dongnecafe.common.config
|
||||
|
||||
import org.springframework.context.annotation.Bean
|
||||
import org.springframework.context.annotation.Configuration
|
||||
import org.springframework.security.config.annotation.web.builders.HttpSecurity
|
||||
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity
|
||||
import org.springframework.security.crypto.factory.PasswordEncoderFactories
|
||||
import org.springframework.security.crypto.password.PasswordEncoder
|
||||
import org.springframework.security.web.SecurityFilterChain
|
||||
|
||||
@Configuration
|
||||
@EnableWebSecurity
|
||||
class SecurityConfig {
|
||||
@Bean
|
||||
fun passwordEncoder(): PasswordEncoder {
|
||||
return PasswordEncoderFactories.createDelegatingPasswordEncoder()
|
||||
}
|
||||
|
||||
@Bean
|
||||
fun filterChain(http: HttpSecurity): SecurityFilterChain {
|
||||
return http
|
||||
.cors().disable()
|
||||
.csrf().disable()
|
||||
.formLogin().disable()
|
||||
.build()
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,24 @@
|
||||
package io.beaniejoy.dongnecafe.controller
|
||||
|
||||
import io.beaniejoy.dongnecafe.domain.member.model.request.SignInRequest
|
||||
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken
|
||||
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder
|
||||
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
|
||||
|
||||
@RestController
|
||||
@RequestMapping("/auth")
|
||||
class AuthController(
|
||||
private val authenticationManagerBuilder: AuthenticationManagerBuilder
|
||||
) {
|
||||
|
||||
@PostMapping("/authenticate")
|
||||
fun signIn(@RequestBody signInRequest: SignInRequest) {
|
||||
val authenticationToken =
|
||||
UsernamePasswordAuthenticationToken(signInRequest.email, signInRequest.password)
|
||||
|
||||
val authenticate = authenticationManagerBuilder.`object`.authenticate(authenticationToken)
|
||||
}
|
||||
}
|
||||
@@ -8,11 +8,11 @@ import org.springframework.web.bind.annotation.RequestMapping
|
||||
import org.springframework.web.bind.annotation.RestController
|
||||
|
||||
@RestController
|
||||
@RequestMapping("/api/members")
|
||||
@RequestMapping("/auth/members")
|
||||
class MemberController(
|
||||
private val memberService: MemberService
|
||||
) {
|
||||
@PostMapping("/signup")
|
||||
@PostMapping("/sign-up")
|
||||
fun signUp(@RequestBody resource: MemberRegisterRequest): Long {
|
||||
return memberService.registerMember(resource)
|
||||
}
|
||||
|
||||
@@ -4,13 +4,15 @@ import io.beaniejoy.dongnecafe.domain.member.entity.Member
|
||||
import io.beaniejoy.dongnecafe.domain.member.model.request.MemberRegisterRequest
|
||||
import io.beaniejoy.dongnecafe.domain.member.repository.MemberRepository
|
||||
import io.beaniejoy.dongnecafe.error.MemberExistedException
|
||||
import org.springframework.security.crypto.password.PasswordEncoder
|
||||
import org.springframework.stereotype.Service
|
||||
import org.springframework.transaction.annotation.Transactional
|
||||
|
||||
@Service
|
||||
@Transactional
|
||||
class MemberService(
|
||||
private val memberRepository: MemberRepository
|
||||
private val memberRepository: MemberRepository,
|
||||
private val passwordEncoder: PasswordEncoder
|
||||
) {
|
||||
fun registerMember(resource: MemberRegisterRequest): Long {
|
||||
memberRepository.findByEmail(resource.email!!)?.also {
|
||||
@@ -20,7 +22,7 @@ class MemberService(
|
||||
val registeredMember = memberRepository.save(
|
||||
Member.createMember(
|
||||
email = resource.email!!,
|
||||
password = resource.password!!,
|
||||
password = passwordEncoder.encode(resource.password!!),
|
||||
address = resource.address!!,
|
||||
phoneNumber = resource.phoneNumber!!
|
||||
)
|
||||
|
||||
@@ -0,0 +1,6 @@
|
||||
package io.beaniejoy.dongnecafe.domain.member.model.request
|
||||
|
||||
data class SignInRequest(
|
||||
val email: String,
|
||||
val password: String
|
||||
)
|
||||
Reference in New Issue
Block a user