Skip to content

Commit

Permalink
Merge pull request #11 from TUK-MoreView/Feat/3-login-jwt
Browse files Browse the repository at this point in the history
pr Feat/3 login jwt
  • Loading branch information
why-only-english authored Jun 13, 2024
2 parents bb5d975 + 917e47b commit 1ff6b8d
Show file tree
Hide file tree
Showing 42 changed files with 1,037 additions and 686 deletions.
32 changes: 19 additions & 13 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -23,44 +23,50 @@ repositories {

dependencies {
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
implementation 'org.springframework.boot:spring-boot-starter-security'
implementation 'org.springframework.boot:spring-boot-starter-web'
implementation 'org.springframework.boot:spring-boot-starter-validation'
implementation('commons-io:commons-io:2.11.0')

compileOnly 'org.projectlombok:lombok'
annotationProcessor 'org.projectlombok:lombok'
testImplementation 'org.springframework.boot:spring-boot-starter-test'

implementation 'org.springframework.boot:spring-boot-starter-websocket'
developmentOnly 'org.springframework.boot:spring-boot-devtools'

//websocket
implementation 'org.springframework.boot:spring-boot-starter-jdbc'
runtimeOnly 'com.mysql:mysql-connector-j'

// websocket
implementation 'org.webjars:sockjs-client'
implementation 'org.webjars:sockjs-client:1.5.1'
implementation 'org.webjars:stomp-websocket:2.3.3'
implementation 'org.springframework.boot:spring-boot-starter-websocket'

//mariaDB
runtimeOnly 'org.mariadb.jdbc:mariadb-java-client'
// mariaDB
runtimeOnly 'org.mariadb.jdbc:mariadb-java-client'

// Gradle
implementation 'javax.persistence:javax.persistence-api:2.2'
implementation 'javax.persistence:javax.persistence-api:2.2'

// Swagger
implementation 'org.springdoc:springdoc-openapi-starter-webmvc-ui:2.3.0'

// Spring Security
implementation 'org.springframework.boot:spring-boot-starter-security'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
testImplementation 'org.springframework.security:spring-security-test'


// oauth
implementation 'org.springframework.boot:spring-boot-starter-oauth2-client'

// jwt
implementation 'io.jsonwebtoken:jjwt-api:0.12.3'
implementation 'io.jsonwebtoken:jjwt-impl:0.12.3'
implementation 'io.jsonwebtoken:jjwt-jackson:0.12.3'
implementation group: 'io.jsonwebtoken', name: 'jjwt-api', version: '0.11.5'
runtimeOnly group: 'io.jsonwebtoken', name: 'jjwt-impl', version: '0.11.5'
runtimeOnly group: 'io.jsonwebtoken', name: 'jjwt-jackson', version: '0.11.5'

// Annotation Processor
annotationProcessor "org.springframework.boot:spring-boot-configuration-processor"
annotationProcessor 'org.projectlombok:lombok'

//validation
// validation
implementation 'org.springframework.boot:spring-boot-starter-validation'
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@

import lombok.Getter;
import org.springframework.data.annotation.CreatedBy;
import org.springframework.data.annotation.CreatedDate;
import org.springframework.data.annotation.LastModifiedBy;
import org.springframework.data.jpa.domain.support.AuditingEntityListener;

Expand Down

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
package com.example.moreveiw.domain.member.controller;

import com.example.moreveiw.domain.member.model.dto.TokenDto;
import com.example.moreveiw.domain.member.model.dto.request.MemberLoginRequest;
import com.example.moreveiw.domain.member.model.dto.request.MemberRequest;
import com.example.moreveiw.domain.member.model.dto.response.MemberResponse;
import com.example.moreveiw.domain.member.service.MemberService;
import com.example.moreveiw.global.security.jwt.JwtFilter;
import com.example.moreveiw.global.security.jwt.TokenProvider;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.validation.Valid;
import lombok.RequiredArgsConstructor;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.web.bind.annotation.*;

@RestController
@RequestMapping("/api")
@RequiredArgsConstructor
public class MemberController {

private final TokenProvider tokenProvider;
private final AuthenticationManagerBuilder authenticationManagerBuilder;
private final MemberService memberService;

@PostMapping("/sign-in")
public ResponseEntity<MemberResponse> signIn(@Valid @RequestBody MemberRequest request) {
return ResponseEntity.ok(memberService.signup(request));
}

@PostMapping("/login")
public ResponseEntity<TokenDto> authorize(@Valid @RequestBody MemberLoginRequest request) {

UsernamePasswordAuthenticationToken authenticationToken =
new UsernamePasswordAuthenticationToken(request.getEmail(), request.getPassword());

Authentication authentication = authenticationManagerBuilder.getObject().authenticate(authenticationToken);
SecurityContextHolder.getContext().setAuthentication(authentication);

String jwt = tokenProvider.createToken(authentication);

HttpHeaders httpHeaders = new HttpHeaders();
httpHeaders.add(JwtFilter.AUTHORIZATION_HEADER, "Bearer " + jwt);

return new ResponseEntity<>(new TokenDto(jwt), httpHeaders, HttpStatus.OK);
}

@GetMapping("/user")
@PreAuthorize("hasAnyRole('USER','ADMIN')")
public ResponseEntity<MemberResponse> getMyUserInfo(HttpServletRequest request) {
return ResponseEntity.ok(memberService.getMyMemberWithAuthorities());
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -8,36 +8,45 @@
@RequiredArgsConstructor
public class MemberEditor {

private final String name;
private final String email;
private final String memberName;
private final String password;
private final String role;

public static MemberEditorBuilder builder() {
return new MemberEditorBuilder();
}

public static class MemberEditorBuilder {
private String name;
private String email;
private String memberName;
private String password;
private String role;

MemberEditorBuilder() {
}

public MemberEditorBuilder name(final String name) {
if (StringUtils.hasText(name)) {
this.name = name;
public MemberEditorBuilder memberName(final String memberName) {
if (StringUtils.hasText(memberName)) {
this.memberName = memberName;
}
return this;
}

public MemberEditorBuilder email(final String email) {
if (StringUtils.hasText(email)) {
this.email = email;
public MemberEditorBuilder password(final String password) {
if (StringUtils.hasText(password)) {
this.password = password;
}
return this;
}

public MemberEditorBuilder role(final String role) {
if (StringUtils.hasText(role)) {
this.role = role;
}
return this;
}

public MemberEditor build() {
return new MemberEditor(name, email);
return new MemberEditor(memberName, password, role);
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package com.example.moreveiw.domain.member.exception;

public class DuplicateMemberException extends RuntimeException {

public DuplicateMemberException() {
super();
}

public DuplicateMemberException(String message, Throwable cause) {
super(message, cause);
}

public DuplicateMemberException(String message) {
super(message);
}

public DuplicateMemberException(Throwable cause) {
super(cause);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package com.example.moreveiw.domain.member.exception;

public class NotFoundMemberException extends RuntimeException {

public NotFoundMemberException() {
super();
}

public NotFoundMemberException(String message, Throwable cause) {
super(message, cause);
}

public NotFoundMemberException(String message) {
super(message);
}

public NotFoundMemberException(Throwable cause) {
super(cause);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package com.example.moreveiw.domain.member.model.dao;

import jakarta.persistence.*;
import lombok.*;

@Entity
@Table(name = "authority")
@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class Authority {

@Id
@Column(name = "authority_name", length = 50)
private String authorityName;
}
Original file line number Diff line number Diff line change
@@ -1,38 +1,36 @@
package com.example.moreveiw.domain.member.model.dao;

import com.example.moreveiw.domain.base.BaseEntity;
import com.example.moreveiw.domain.member.editor.MemberEditor;
import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
import jakarta.persistence.*;
import jakarta.validation.constraints.Email;
import lombok.*;

import java.util.Set;

@Entity
@Getter
@Builder
@Entity
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@AllArgsConstructor
public class Member extends BaseEntity {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "user_id")
private Long id;

private String memberName;

private String name;
private String password;

@Email
private String email;

private String role;

public MemberEditor.MemberEditorBuilder toEditor() {
return MemberEditor.builder()
.name(name)
.email(email);
}

@JoinTable(
name = "user_authority",
joinColumns = {@JoinColumn(name = "user_id", referencedColumnName = "user_id")},
inverseJoinColumns = {@JoinColumn(name = "authority_name", referencedColumnName = "authority_name")})
@ManyToMany
private Set<Authority> authorities;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
package com.example.moreveiw.domain.member.model.dao;

import com.example.moreveiw.domain.member.model.dto.request.MemberRequest;
import com.example.moreveiw.domain.member.model.dto.response.MemberListResponse;
import com.example.moreveiw.domain.member.model.dto.response.MemberResponse;
import lombok.RequiredArgsConstructor;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.stereotype.Component;

import java.util.Collections;
import java.util.List;
import java.util.stream.Collectors;

@Component
@RequiredArgsConstructor
public class MemberMapper {

private final PasswordEncoder passwordEncoder;

public Member toEntity(MemberRequest request) {

Member member = Member.builder()
.name(request.getName())
.email(request.getEmail())
.password(passwordEncoder.encode(request.getPassword()))
.build();

return member;
}

public MemberResponse toResponse(Member member) {
if (member == null) return null;

return MemberResponse.builder()
.email(member.getEmail())
.role(member.getRole())
.name(member.getName())
.build();
}

public MemberListResponse toListResponse(List<Member> memberList) {
List<MemberResponse> memberResponseList =
memberList.stream().map(this::toResponse).collect(Collectors.toList());
return MemberListResponse.builder()
.memberList(memberResponseList)
.build();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package com.example.moreveiw.domain.member.model.dao;

public enum Role {
ADMIN, USER
}
Loading

0 comments on commit 1ff6b8d

Please sign in to comment.