diff --git a/spring-boot-study/build.gradle b/spring-boot-study/build.gradle index aedabf6..23791cc 100644 --- a/spring-boot-study/build.gradle +++ b/spring-boot-study/build.gradle @@ -21,11 +21,14 @@ repositories { dependencies { implementation 'org.springframework.boot:spring-boot-starter-web' implementation 'org.springframework.boot:spring-boot-starter-data-jpa' + implementation 'org.springframework.security.oauth.boot:spring-security-oauth2-autoconfigure:2.2.2.RELEASE' compileOnly 'org.projectlombok:lombok' runtimeOnly 'com.h2database:h2' annotationProcessor 'org.projectlombok:lombok' + + testImplementation 'org.springframework.security:spring-security-test' testImplementation('org.springframework.boot:spring-boot-starter-test') { exclude group: 'org.junit.vintage', module: 'junit-vintage-engine' } diff --git a/spring-boot-study/src/main/java/me/sun/springbootstudy/AppRunner.java b/spring-boot-study/src/main/java/me/sun/springbootstudy/AppRunner.java new file mode 100644 index 0000000..0679c04 --- /dev/null +++ b/spring-boot-study/src/main/java/me/sun/springbootstudy/AppRunner.java @@ -0,0 +1,27 @@ +package me.sun.springbootstudy; + +import lombok.RequiredArgsConstructor; +import me.sun.springbootstudy.domain.member.MemberRole; +import me.sun.springbootstudy.domain.member.MemberService; +import me.sun.springbootstudy.web.dto.MemberJoinRequestDto; +import org.springframework.boot.ApplicationArguments; +import org.springframework.boot.ApplicationRunner; +import org.springframework.stereotype.Component; + +@RequiredArgsConstructor +@Component +public class AppRunner implements ApplicationRunner { + + private final MemberService memberService; + + @Override + public void run(ApplicationArguments args) throws Exception { + MemberJoinRequestDto dto = MemberJoinRequestDto.builder() + .email("test@gmail.com") + .password("qwe123") + .role(MemberRole.USER) + .name("홍길동") + .build(); + memberService.save(dto); + } +} diff --git a/spring-boot-study/src/main/java/me/sun/springbootstudy/config/AppConfig.java b/spring-boot-study/src/main/java/me/sun/springbootstudy/config/AppConfig.java new file mode 100644 index 0000000..2826499 --- /dev/null +++ b/spring-boot-study/src/main/java/me/sun/springbootstudy/config/AppConfig.java @@ -0,0 +1,15 @@ +package me.sun.springbootstudy.config; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.security.crypto.factory.PasswordEncoderFactories; +import org.springframework.security.crypto.password.PasswordEncoder; + +@Configuration +public class AppConfig { + + @Bean + public PasswordEncoder passwordEncoder() { + return PasswordEncoderFactories.createDelegatingPasswordEncoder(); + } +} diff --git a/spring-boot-study/src/main/java/me/sun/springbootstudy/config/AuthorizationServer.java b/spring-boot-study/src/main/java/me/sun/springbootstudy/config/AuthorizationServer.java new file mode 100644 index 0000000..cb8f1ae --- /dev/null +++ b/spring-boot-study/src/main/java/me/sun/springbootstudy/config/AuthorizationServer.java @@ -0,0 +1,69 @@ +package me.sun.springbootstudy.config; + +import lombok.RequiredArgsConstructor; +import me.sun.springbootstudy.domain.member.MemberService; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.security.authentication.AuthenticationManager; +import org.springframework.security.crypto.password.PasswordEncoder; +import org.springframework.security.oauth2.config.annotation.configurers.ClientDetailsServiceConfigurer; +import org.springframework.security.oauth2.config.annotation.web.configuration.AuthorizationServerConfigurerAdapter; +import org.springframework.security.oauth2.config.annotation.web.configuration.EnableAuthorizationServer; +import org.springframework.security.oauth2.config.annotation.web.configurers.AuthorizationServerEndpointsConfigurer; +import org.springframework.security.oauth2.config.annotation.web.configurers.AuthorizationServerSecurityConfigurer; +import org.springframework.security.oauth2.provider.token.TokenStore; +import org.springframework.security.oauth2.provider.token.store.JwtAccessTokenConverter; +import org.springframework.security.oauth2.provider.token.store.JwtTokenStore; + +@RequiredArgsConstructor +@EnableAuthorizationServer +@Configuration +public class AuthorizationServer extends AuthorizationServerConfigurerAdapter { + + private final PasswordEncoder passwordEncoder; + private final AuthenticationManager authenticationManager; + private final MemberService memberService; + + @Value("${custom.clientId}") + private String clientId; + @Value("${custom.clientSecret}") + private String clientSecret; + @Value("${custom.jwtKey}") + private String jwtKey; + + @Override + public void configure(AuthorizationServerSecurityConfigurer security) throws Exception { + security.passwordEncoder(passwordEncoder); + } + + @Override + public void configure(ClientDetailsServiceConfigurer clients) throws Exception { + clients.inMemory() + .withClient(clientId) + .authorizedGrantTypes("password", "refresh_token") + .scopes("read", "profile") + .secret(passwordEncoder.encode(clientSecret)) + .accessTokenValiditySeconds(10 * 60) + .refreshTokenValiditySeconds(6 * 10 * 60); + } + + @Override + public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception { + endpoints.authenticationManager(authenticationManager) + .userDetailsService(memberService) + .tokenStore(tokenStore()) + .accessTokenConverter(jwtAccessTokenConverter()); + } + + @Bean + public TokenStore tokenStore() { + return new JwtTokenStore(jwtAccessTokenConverter()); + } + + private JwtAccessTokenConverter jwtAccessTokenConverter() { + JwtAccessTokenConverter converter = new JwtAccessTokenConverter(); + converter.setSigningKey(jwtKey); + return converter; + } +} diff --git a/spring-boot-study/src/main/java/me/sun/springbootstudy/config/SecurityConfig.java b/spring-boot-study/src/main/java/me/sun/springbootstudy/config/SecurityConfig.java new file mode 100644 index 0000000..4ec7dad --- /dev/null +++ b/spring-boot-study/src/main/java/me/sun/springbootstudy/config/SecurityConfig.java @@ -0,0 +1,44 @@ +package me.sun.springbootstudy.config; + +import lombok.RequiredArgsConstructor; +import me.sun.springbootstudy.domain.member.MemberService; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.http.HttpMethod; +import org.springframework.security.authentication.AuthenticationManager; +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.EnableWebSecurity; +import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; +import org.springframework.security.crypto.password.PasswordEncoder; + +@RequiredArgsConstructor +@Configuration +@EnableWebSecurity +public class SecurityConfig extends WebSecurityConfigurerAdapter { + + private final MemberService memberService; + private final PasswordEncoder passwordEncoder; + + @Bean + @Override + public AuthenticationManager authenticationManagerBean() throws Exception { + return super.authenticationManagerBean(); + } + + @Override + protected void configure(AuthenticationManagerBuilder auth) throws Exception { + auth.userDetailsService(memberService) + .passwordEncoder(passwordEncoder); + } + + + @Override + protected void configure(HttpSecurity http) throws Exception { + http + .authorizeRequests() + .antMatchers(HttpMethod.POST, "/api/members/join").permitAll() + .anyRequest().authenticated(); + + } +} diff --git a/spring-boot-study/src/main/java/me/sun/springbootstudy/member/Member.java b/spring-boot-study/src/main/java/me/sun/springbootstudy/domain/member/Member.java similarity index 84% rename from spring-boot-study/src/main/java/me/sun/springbootstudy/member/Member.java rename to spring-boot-study/src/main/java/me/sun/springbootstudy/domain/member/Member.java index 7c19c39..9f23553 100644 --- a/spring-boot-study/src/main/java/me/sun/springbootstudy/member/Member.java +++ b/spring-boot-study/src/main/java/me/sun/springbootstudy/domain/member/Member.java @@ -1,4 +1,4 @@ -package me.sun.springbootstudy.member; +package me.sun.springbootstudy.domain.member; import lombok.AccessLevel; import lombok.Builder; @@ -35,4 +35,8 @@ public Member(String email, String password, String name, MemberRole role) { this.name = name; this.role = role; } + + public void encodingPassword(String password) { + this.password = password; + } } diff --git a/spring-boot-study/src/main/java/me/sun/springbootstudy/member/MemberRepository.java b/spring-boot-study/src/main/java/me/sun/springbootstudy/domain/member/MemberRepository.java similarity index 82% rename from spring-boot-study/src/main/java/me/sun/springbootstudy/member/MemberRepository.java rename to spring-boot-study/src/main/java/me/sun/springbootstudy/domain/member/MemberRepository.java index 4e92356..705d119 100644 --- a/spring-boot-study/src/main/java/me/sun/springbootstudy/member/MemberRepository.java +++ b/spring-boot-study/src/main/java/me/sun/springbootstudy/domain/member/MemberRepository.java @@ -1,4 +1,4 @@ -package me.sun.springbootstudy.member; +package me.sun.springbootstudy.domain.member; import org.springframework.data.jpa.repository.JpaRepository; diff --git a/spring-boot-study/src/main/java/me/sun/springbootstudy/domain/member/MemberRole.java b/spring-boot-study/src/main/java/me/sun/springbootstudy/domain/member/MemberRole.java new file mode 100644 index 0000000..e6c567b --- /dev/null +++ b/spring-boot-study/src/main/java/me/sun/springbootstudy/domain/member/MemberRole.java @@ -0,0 +1,5 @@ +package me.sun.springbootstudy.domain.member; + +public enum MemberRole { + ADMIN, USER +} diff --git a/spring-boot-study/src/main/java/me/sun/springbootstudy/domain/member/MemberService.java b/spring-boot-study/src/main/java/me/sun/springbootstudy/domain/member/MemberService.java new file mode 100644 index 0000000..7a7bacf --- /dev/null +++ b/spring-boot-study/src/main/java/me/sun/springbootstudy/domain/member/MemberService.java @@ -0,0 +1,52 @@ +package me.sun.springbootstudy.domain.member; + +import lombok.RequiredArgsConstructor; +import me.sun.springbootstudy.web.dto.MemberJoinRequestDto; +import me.sun.springbootstudy.web.dto.MemberResponseDto; +import org.springframework.security.core.GrantedAuthority; +import org.springframework.security.core.authority.SimpleGrantedAuthority; +import org.springframework.security.core.userdetails.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.security.crypto.password.PasswordEncoder; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Collection; +import java.util.Collections; + +@RequiredArgsConstructor +@Service +@Transactional(readOnly = true) +public class MemberService implements UserDetailsService { + + private final MemberRepository memberRepository; + private final PasswordEncoder passwordEncoder; + + @Transactional + public Long save(MemberJoinRequestDto dto) { + Member member = dto.toEntity(); + member.encodingPassword(passwordEncoder.encode(member.getPassword())); + return memberRepository.save(member).getId(); + } + + public MemberResponseDto findOne(Long id) { + Member member = memberRepository.findById(id) + .orElseThrow(() -> new IllegalArgumentException("해당 유저가 존재하지 않습니다.")); + + return new MemberResponseDto(member); + } + + @Override + public UserDetails loadUserByUsername(String email) throws UsernameNotFoundException { + Member member = memberRepository.findByEmail(email) + .orElseThrow(() -> new UsernameNotFoundException(email)); + + return new User(member.getEmail(), member.getPassword(), authorities(member.getRole())); + } + + private Collection authorities(MemberRole role) { + return Collections.singleton(new SimpleGrantedAuthority("ROLE_" + role.toString())); + } +} diff --git a/spring-boot-study/src/main/java/me/sun/springbootstudy/member/MemberRole.java b/spring-boot-study/src/main/java/me/sun/springbootstudy/member/MemberRole.java deleted file mode 100644 index 0a645ab..0000000 --- a/spring-boot-study/src/main/java/me/sun/springbootstudy/member/MemberRole.java +++ /dev/null @@ -1,5 +0,0 @@ -package me.sun.springbootstudy.member; - -public enum MemberRole { - ADMIN, USER -} diff --git a/spring-boot-study/src/main/java/me/sun/springbootstudy/member/MemberService.java b/spring-boot-study/src/main/java/me/sun/springbootstudy/member/MemberService.java deleted file mode 100644 index 5a8cf95..0000000 --- a/spring-boot-study/src/main/java/me/sun/springbootstudy/member/MemberService.java +++ /dev/null @@ -1,28 +0,0 @@ -package me.sun.springbootstudy.member; - -import lombok.RequiredArgsConstructor; -import me.sun.springbootstudy.web.dto.MemberJoinRequestDto; -import me.sun.springbootstudy.web.dto.MemberResponseDto; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -@RequiredArgsConstructor -@Service -@Transactional(readOnly = true) -public class MemberService { - - private final MemberRepository memberRepository; - - @Transactional - public Long save(MemberJoinRequestDto dto) { - return memberRepository.save(dto.toEntity()).getId(); - } - - public MemberResponseDto findOne(Long id) { - Member member = memberRepository.findById(id) - .orElseThrow(() -> new IllegalArgumentException("해당 유저가 존재하지 않습니다.")); - - return new MemberResponseDto(member); - } - -} diff --git a/spring-boot-study/src/main/java/me/sun/springbootstudy/web/MemberApiController.java b/spring-boot-study/src/main/java/me/sun/springbootstudy/web/MemberApiController.java new file mode 100644 index 0000000..38ad9a8 --- /dev/null +++ b/spring-boot-study/src/main/java/me/sun/springbootstudy/web/MemberApiController.java @@ -0,0 +1,33 @@ +package me.sun.springbootstudy.web; + +import lombok.RequiredArgsConstructor; +import me.sun.springbootstudy.domain.member.MemberService; +import me.sun.springbootstudy.web.dto.MemberJoinRequestDto; +import org.springframework.http.ResponseEntity; +import org.springframework.validation.Errors; +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; + +@RequiredArgsConstructor +@RestController +@RequestMapping("/api/members") +public class MemberApiController { + + private final MemberService memberService; + + @PostMapping("/join") + public ResponseEntity joinMember(@RequestBody @Valid MemberJoinRequestDto dto, + Errors errors) { + if (errors.hasErrors()) { + return ResponseEntity.badRequest().build(); + } + memberService.save(dto); + + return ResponseEntity.ok().build(); + } + +} diff --git a/spring-boot-study/src/main/java/me/sun/springbootstudy/web/MemberController.java b/spring-boot-study/src/main/java/me/sun/springbootstudy/web/MemberController.java deleted file mode 100644 index 7583359..0000000 --- a/spring-boot-study/src/main/java/me/sun/springbootstudy/web/MemberController.java +++ /dev/null @@ -1,4 +0,0 @@ -package me.sun.springbootstudy.web; - -public class MemberController { -} diff --git a/spring-boot-study/src/main/java/me/sun/springbootstudy/web/dto/MemberJoinRequestDto.java b/spring-boot-study/src/main/java/me/sun/springbootstudy/web/dto/MemberJoinRequestDto.java index 2bfe5c9..daa8bc5 100644 --- a/spring-boot-study/src/main/java/me/sun/springbootstudy/web/dto/MemberJoinRequestDto.java +++ b/spring-boot-study/src/main/java/me/sun/springbootstudy/web/dto/MemberJoinRequestDto.java @@ -3,16 +3,23 @@ import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; -import me.sun.springbootstudy.member.Member; -import me.sun.springbootstudy.member.MemberRole; +import me.sun.springbootstudy.domain.member.Member; +import me.sun.springbootstudy.domain.member.MemberRole; + +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; @NoArgsConstructor @Getter public class MemberJoinRequestDto { + @NotEmpty private String email; + @NotEmpty private String password; + @NotEmpty private String name; + @NotNull private MemberRole role; @Builder diff --git a/spring-boot-study/src/main/java/me/sun/springbootstudy/web/dto/MemberResponseDto.java b/spring-boot-study/src/main/java/me/sun/springbootstudy/web/dto/MemberResponseDto.java index 81b7bf0..af1e457 100644 --- a/spring-boot-study/src/main/java/me/sun/springbootstudy/web/dto/MemberResponseDto.java +++ b/spring-boot-study/src/main/java/me/sun/springbootstudy/web/dto/MemberResponseDto.java @@ -2,8 +2,8 @@ import lombok.Getter; import lombok.NoArgsConstructor; -import me.sun.springbootstudy.member.Member; -import me.sun.springbootstudy.member.MemberRole; +import me.sun.springbootstudy.domain.member.Member; +import me.sun.springbootstudy.domain.member.MemberRole; @Getter @NoArgsConstructor diff --git a/spring-boot-study/src/main/resources/application.yml b/spring-boot-study/src/main/resources/application.yml index ca8289b..52d6ca9 100644 --- a/spring-boot-study/src/main/resources/application.yml +++ b/spring-boot-study/src/main/resources/application.yml @@ -10,4 +10,9 @@ spring: properties: hibernate: format_sql: true - show_sql: true \ No newline at end of file + show_sql: true + +custom: + clientId: clientApp + clientSecret: secret + jwtKey: test \ No newline at end of file diff --git a/spring-boot-study/src/test/java/me/sun/springbootstudy/ValueTest.java b/spring-boot-study/src/test/java/me/sun/springbootstudy/ValueTest.java new file mode 100644 index 0000000..8679e54 --- /dev/null +++ b/spring-boot-study/src/test/java/me/sun/springbootstudy/ValueTest.java @@ -0,0 +1,24 @@ +package me.sun.springbootstudy; + +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.test.context.SpringBootTest; + +@SpringBootTest +public class ValueTest { + + @Value("${custom.clientId}") + private String clientId; + @Value("${custom.clientSecret}") + private String clientSecret; + @Value("${custom.jwtKey}") + private String jwtKey; + + @Test + void value() throws Exception { + System.out.println(clientId); + System.out.println(clientSecret); + System.out.println(jwtKey); + } + +} diff --git a/spring-boot-study/src/test/java/me/sun/springbootstudy/member/MemberRepositoryTest.java b/spring-boot-study/src/test/java/me/sun/springbootstudy/domain/member/MemberRepositoryTest.java similarity index 97% rename from spring-boot-study/src/test/java/me/sun/springbootstudy/member/MemberRepositoryTest.java rename to spring-boot-study/src/test/java/me/sun/springbootstudy/domain/member/MemberRepositoryTest.java index f7db221..9bb53c3 100644 --- a/spring-boot-study/src/test/java/me/sun/springbootstudy/member/MemberRepositoryTest.java +++ b/spring-boot-study/src/test/java/me/sun/springbootstudy/domain/member/MemberRepositoryTest.java @@ -1,4 +1,4 @@ -package me.sun.springbootstudy.member; +package me.sun.springbootstudy.domain.member; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; @@ -57,5 +57,4 @@ void findByEmail() throws Exception { //then assertThat(findMember.getEmail()).isEqualTo(email); } - } \ No newline at end of file diff --git a/spring-boot-study/src/test/java/me/sun/springbootstudy/member/MemberServiceTest.java b/spring-boot-study/src/test/java/me/sun/springbootstudy/domain/member/MemberServiceTest.java similarity index 67% rename from spring-boot-study/src/test/java/me/sun/springbootstudy/member/MemberServiceTest.java rename to spring-boot-study/src/test/java/me/sun/springbootstudy/domain/member/MemberServiceTest.java index 580a742..6312c58 100644 --- a/spring-boot-study/src/test/java/me/sun/springbootstudy/member/MemberServiceTest.java +++ b/spring-boot-study/src/test/java/me/sun/springbootstudy/domain/member/MemberServiceTest.java @@ -1,4 +1,4 @@ -package me.sun.springbootstudy.member; +package me.sun.springbootstudy.domain.member; import me.sun.springbootstudy.web.dto.MemberJoinRequestDto; import me.sun.springbootstudy.web.dto.MemberResponseDto; @@ -15,6 +15,9 @@ class MemberServiceTest { @Autowired MemberService memberService; + @Autowired + MemberRepository memberRepository; + @Test void joinMemberAndFind() throws Exception { //given @@ -43,4 +46,23 @@ void FindNonExistMember() throws Exception { .hasMessage("해당 유저가 존재하지 않습니다."); } + @Test + void passwordEncode() throws Exception { + //given + MemberJoinRequestDto joinDto = MemberJoinRequestDto.builder() + .email("email@gmail.com") + .password("password") + .name("John") + .role(MemberRole.USER) + .build(); + //when + Long savedId = memberService.save(joinDto); + Member member = memberRepository.findById(savedId) + .orElseThrow(() -> new IllegalArgumentException("해당 유저가 존재하지 않습니다.")); + + //then + assertThat(member.getPassword()).isNotEqualTo(joinDto.getPassword()); + } + + } \ No newline at end of file diff --git a/spring-boot-study/src/test/java/me/sun/springbootstudy/web/MemberApiControllerTest.java b/spring-boot-study/src/test/java/me/sun/springbootstudy/web/MemberApiControllerTest.java new file mode 100644 index 0000000..936ce70 --- /dev/null +++ b/spring-boot-study/src/test/java/me/sun/springbootstudy/web/MemberApiControllerTest.java @@ -0,0 +1,84 @@ +package me.sun.springbootstudy.web; + +import com.fasterxml.jackson.databind.ObjectMapper; +import me.sun.springbootstudy.domain.member.MemberRole; +import me.sun.springbootstudy.domain.member.MemberService; +import me.sun.springbootstudy.web.dto.MemberJoinRequestDto; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.http.MediaType; +import org.springframework.test.web.servlet.MockMvc; + +import static org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestPostProcessors.httpBasic; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; +import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +@SpringBootTest +@AutoConfigureMockMvc +class MemberApiControllerTest { + + @Autowired + MemberApiController memberApiController; + + @Autowired + MemberService memberService; + + @Autowired + ObjectMapper objectMapper; + + @Autowired + MockMvc mockMvc; + + @Value("${custom.clientId}") + String clientId; + + @Value("${custom.clientSecret}") + String clientSecret; + + @Test + void joinMember() throws Exception { + //given + MemberJoinRequestDto joinDto = MemberJoinRequestDto.builder() + .email("email@gmail.com") + .password("password") + .name("John") + .role(MemberRole.USER) + .build(); + + //when & then + this.mockMvc.perform(post("/api/members/join") + .contentType(MediaType.APPLICATION_JSON) + .content(objectMapper.writeValueAsString(joinDto))) + .andDo(print()) + .andExpect(status().isOk()); + } + + @Test + void getJwtToken() throws Exception { + //given + String password = "qwe123"; + String email = "email@gmail.com"; + MemberJoinRequestDto joinDto = MemberJoinRequestDto.builder() + .email(email) + .password(password) + .name("John") + .role(MemberRole.USER) + .build(); + memberService.save(joinDto); + + //when & then + this.mockMvc.perform(post("/oauth/token") + .with(httpBasic(clientId, clientSecret)) + .param("username", email) + .param("password", password) + .param("grant_type", "password") + ).andDo(print()); + + } + + +} \ No newline at end of file diff --git a/spring-boot-study/src/test/resources/application.yml b/spring-boot-study/src/test/resources/application.yml index d4eaea9..63ba484 100644 --- a/spring-boot-study/src/test/resources/application.yml +++ b/spring-boot-study/src/test/resources/application.yml @@ -5,4 +5,9 @@ spring: properties: hibernate: format_sql: true - show_sql: true \ No newline at end of file + show_sql: true + +custom: + clientId: clientApp + clientSecret: secret + jwtKey: test \ No newline at end of file