Skip to content

Commit

Permalink
feat: logic according to conditions
Browse files Browse the repository at this point in the history
  • Loading branch information
dami0806 committed Jun 4, 2024
1 parent 9bb76c7 commit cc2779c
Show file tree
Hide file tree
Showing 9 changed files with 222 additions and 114 deletions.
Original file line number Diff line number Diff line change
@@ -1,20 +1,25 @@
package com.sparta.oneandzerobest.auth.controller;


import com.sparta.oneandzerobest.auth.dto.LoginRequestDto;
import com.sparta.oneandzerobest.auth.dto.RefreshTokenRequestDto;
import com.sparta.oneandzerobest.auth.dto.SignupRequestDto;
import com.sparta.oneandzerobest.auth.dto.TokenResponseDto;
import com.sparta.oneandzerobest.auth.entity.LoginRequest;
import com.sparta.oneandzerobest.auth.entity.LoginResponse;
import com.sparta.oneandzerobest.auth.entity.SignupRequest;
import com.sparta.oneandzerobest.auth.service.UserService;
import com.sparta.oneandzerobest.auth.util.JwtUtil;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
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 org.springframework.web.bind.annotation.*;

/**
* 인증기능 컨트롤러
* - 로그인
* - 로그아웃
* - 탈퇴
* - 리프레시 토큰 재발급
*/
@RestController
@RequestMapping("/api/auth")
public class AuthRestController {
Expand All @@ -26,33 +31,64 @@ public AuthRestController(UserService userService, JwtUtil jwtUtil) {
this.jwtUtil = jwtUtil;
}

/**
* 회원가입
* @param signupRequest
* @return
*/
@PostMapping("/signup")
public ResponseEntity<String> signup(@RequestBody SignupRequestDto signupRequestDto) {
SignupRequest signupRequest = new SignupRequest(
signupRequestDto.getUsername(),
signupRequestDto.getPassword(),
signupRequestDto.getEmail(),
signupRequestDto.isAdmin(),
signupRequestDto.getAdminToken()
);
public ResponseEntity<String> signup(@RequestBody SignupRequest signupRequest) {
userService.signup(signupRequest);
return ResponseEntity.ok("회원가입 성공");
return ResponseEntity.status(HttpStatus.CREATED).body("회원가입 성공");
}

/**
* 로그인
* @param loginRequest
* @return 헤더에 반환
*/
@PostMapping("/login")
public ResponseEntity<TokenResponseDto> login(@RequestBody LoginRequestDto loginRequestDto) {
LoginRequest loginRequest = new LoginRequest(
loginRequestDto.getUsername(),
loginRequestDto.getPassword()
);
public ResponseEntity<String> login(@RequestBody LoginRequest loginRequest) {
LoginResponse tokens = userService.login(loginRequest); // 로그인 시도 및 토큰 생성
String accessToken = tokens.getAccessToken();
String refreshToken = tokens.getRefreshToken();

String token = userService.login(loginRequest);
String refreshToken = jwtUtil.createRefreshToken(loginRequestDto.getUsername());
// 각 토큰을 별도의 헤더에 설정
HttpHeaders headers = new HttpHeaders();
headers.set("Authorization", "Bearer " + accessToken);
headers.set("Refresh-Token", refreshToken);

TokenResponseDto tokenResponseDto = new TokenResponseDto(token, refreshToken);
return ResponseEntity.ok(tokenResponseDto);
return new ResponseEntity<>("로그인 성공", headers, HttpStatus.OK);
}

/**
* 로그아웃
* @param username
* @return
*/
@PostMapping("/logout")
public ResponseEntity<String> logout(@RequestParam String username) {
userService.logout(username);
return ResponseEntity.ok("로그아웃 성공");
}

/**
*withdraw: 탈퇴
* @param username
* @param password
* @return
*/
@PostMapping("/withdraw")
public ResponseEntity<String> withdraw(@RequestParam String username, @RequestParam String password) {
userService.withdraw(username, password);
return ResponseEntity.ok("회원탈퇴 성공");
}

/**
* 리프레시 토큰 재발급
* @param refreshTokenRequestDto
* @return
*/
@PostMapping("/refresh")
public ResponseEntity<TokenResponseDto> refresh(@RequestBody RefreshTokenRequestDto refreshTokenRequestDto) {

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,6 @@
public class SignupRequestDto {
private String username;
private String password;
private String name;
private String email;
private boolean admin = false;
private String adminToken = "";
}
Original file line number Diff line number Diff line change
@@ -1,12 +1,14 @@
package com.sparta.oneandzerobest.auth.entity;

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;

@Getter
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class LoginRequest {
private String username;
private String password;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package com.sparta.oneandzerobest.auth.entity;


import lombok.Builder;
import lombok.Getter;

@Getter
@Builder
public class LoginResponse {
private String accessToken;
private String refreshToken;
}
64 changes: 32 additions & 32 deletions src/main/java/com/sparta/oneandzerobest/auth/entity/User.java
Original file line number Diff line number Diff line change
Expand Up @@ -5,11 +5,9 @@
import lombok.NoArgsConstructor;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.userdetails.UserDetails;

import java.time.LocalDateTime;
import java.util.Collection;
import java.util.Collections;
import java.util.HashSet;
import java.util.Set;

@Entity
@Getter
Expand All @@ -26,52 +24,54 @@ public class User implements UserDetails { // Spring Security의 UserDetails
@Column(nullable = false)
private String password;

@Column(nullable = false)
private String name;

@Column(nullable = false, unique = true)
private String email;


@ElementCollection(fetch = FetchType.EAGER)
private Set<String> authorities;
@Column
private String introduction;

@Column(nullable = false)
@Enumerated(value = EnumType.STRING)
private UserRoleEnum role;
private String statusCode;

@Column
private String refreshToken;

public User(String username, String password, String email, UserRoleEnum role) {
@Column
private LocalDateTime statusChangeTime;

@Column(nullable = false, updatable = false)
private LocalDateTime createdAt;

@Column
private LocalDateTime updatedAt;

public User(String username, String password, String name, String email, String statusCode) {
this.username = username;
this.password = password;
this.name = name;
this.email = email;
this.role = role;
this.authorities = Collections.singleton(role.name());
}

@Override
public Collection<? extends GrantedAuthority> getAuthorities() {
Set<GrantedAuthority> grantedAuthorities = new HashSet<>();
for (String authority : this.authorities) {
grantedAuthorities.add(() -> authority);
}
return grantedAuthorities;
this.statusCode = statusCode;
this.createdAt = LocalDateTime.now();
}


@Override
public boolean isAccountNonExpired() {
return false;
public void setStatusCode(String statusCode) {
this.statusCode = statusCode;
}

@Override
public boolean isAccountNonLocked() {
return false;
public void setRefreshToken(String refreshToken) {
this.refreshToken = refreshToken;
}

@Override
public boolean isCredentialsNonExpired() {
return false;
public boolean isEnabled() {
return "정상".equals(this.statusCode); // 계정이 활성화된 상태인지 확인
}

@Override
public boolean isEnabled() {
return false;
public Collection<? extends GrantedAuthority> getAuthorities() {
return Collections.emptyList(); // 권한 관련 설정
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,9 @@

import java.util.Optional;

/**
* UserDetailsService 구현제 서비스
*/
@Service
public class UserDetailsServiceImpl implements UserDetailsService {

Expand Down
Original file line number Diff line number Diff line change
@@ -1,10 +1,19 @@
package com.sparta.oneandzerobest.auth.service;

import com.sparta.oneandzerobest.auth.dto.TokenResponseDto;
import com.sparta.oneandzerobest.auth.entity.LoginRequest;
import com.sparta.oneandzerobest.auth.entity.LoginResponse;
import com.sparta.oneandzerobest.auth.entity.SignupRequest;

public interface UserService {
// 회원가입
void signup(SignupRequest signupRequest);
String login(LoginRequest loginRequest);

// 로그인
LoginResponse login(LoginRequest loginRequest);
// 로그아웃
void logout(String username);
// 탈퇴
void withdraw(String username, String password);
// 리프레시 토큰
TokenResponseDto refresh(String refreshToken);
}
Loading

0 comments on commit cc2779c

Please sign in to comment.