Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[feat] #190 - Admin 기능 구현 #208

Merged
merged 75 commits into from
Sep 10, 2024
Merged

[feat] #190 - Admin 기능 구현 #208

merged 75 commits into from
Sep 10, 2024

Conversation

hoonyworld
Copy link
Member

@hoonyworld hoonyworld commented Sep 5, 2024

Related issue 🛠

Work Description ✏️

리드 회의 결과 admin 기능의 경우 디자이너와 프론트와 협업해 관리자 페이지를 작업하기로 결정을 하여서 기능 구현 위주로 작업을 진행하였습니다!

어드민 기능 제작 작업을 하면서, 기존에 의존하는 클래스들이 많아 대규모 리팩토링을 하게 되었습니다.
따라서 수정사항이 많아졌는데, 감안하고 봐주시면 감사하겠습니다.... (죄송합니다 ㅠㅠ)

1. 기존 공연 메이커를 위한 presigned-url 응답 방식 변경

  • status, message, data로 기존에 응답값을 통일 하고 있었기에 해당 응답 값을 통일된 방식에 맞춰 변경하였습니다!
{
    "status": 200,
    "message": "공연 메이커를 위한 Presigned URL 발급 성공",
    "data": {
        "performanceMakerPresignedUrls": {
            "cast": {
                "a.png": "https:/~~~~"
            },
            "performance": {
                "b.png": "https:/~~~~"
            },
            "staff": {
                "c.png": "https:/~~~~"
            },
            "poster": {
                "d.png": "https:/~~~~"
            }
        }
    }
}

2. 전반적인 서비스 로직 리팩토링

  • 기존 MemberService를 역할과 책임에 맞게 AuthenticationService(토큰 발급 관련 서비스 로직), MemberRegistrationService(회원가입 시 회원정보를 저장하는 서비스 로직), MemberService(회원 검증 및 조회 서비스 로직), SocialLoginService(소셜 로그인 서비스로직)으로 분리하였습니다.
  • 메서드 명을 컨벤션에 맞게, 역할에 부합하도록 변경하였고 코드 가독성을 높이는 방향으로 코드를 변경하였습니다.

3. 어드민 기능 도입

  • Role enum을 Users 엔티티에 추가해 역할을 관리할 수 있도록 하였습니다.
  • 비회원 예매시 유저 테이블에 저장되는 사용자의 역할은 User로, 소셜 회원가입 시 유저테이블에 저장되는 사용자의 역할은 Member로 저장될 수 있도록 하였습니다.
  • 소셜 로그인 시, 해당 역할에 맞는 토큰을 다시 생성할 수 있도록 하였습니다.
  • AdminAuthentication 클래스를 만들고 해당 클래스를 통해 어드민 인증 객체를 생성할 수 있도록 하였습니다.
  • jwt 필터를 역할에 따라 다른 인증객체를 생성할 수 있도록 개편하였습니다.
  • jwt 프로바이더에서 Claim 객체를 생성할 때 역할을 같이 부여할 수 있도록 개편하였습니다.
  • Spring Security에서 사용자 중 ROLE_ADMIN의 경우에만 /admin/** 경로에 접근할 수 있도록 설정하였습니다.
  • 관리자가 모든 유저의 정보를 불러오는 GET API를 생성하였습니다.
  • 캐러셀, 배너 presignedURL 발급 GET API를 생성하였습니다.

Trouble Shooting ⚽️

Related ScreenShot 📷

공연 메이커 presignedUrl json 응답 리팩토링 (bucket 주소가 있어서 url 부분은 안보이게 캡쳐했습니다!)

image
  • status, message, data의 형식으로 응답을 반환하도록 리팩토링했습니다.

캐러셀 presignedUrl 구현(bucket 주소가 있어서 url 부분은 안보이게 캡쳐했습니다!)

image
  • 토큰을 주고 해당 토큰에 관리자 권한이 있는지 판단해서 관리자 권한이 있을 경우 발급이 가능하도록 구현했습니다!
image
  • 토큰에 관리자 권한이 없을 경우 403 에러를 반환하도록 설계했습니다.

배너 presignedUrl 구현(bucket 주소가 있어서 url 부분은 안보이게 캡쳐했습니다!)

image
  • 토큰을 주고 해당 토큰에 관리자 권한이 있는지 판단해서 관리자 권한이 있을 경우 발급이 가능하도록 구현했습니다!
image
  • 토큰에 관리자 권한이 없을 경우 403 에러를 반환하도록 설계했습니다.

관리자 페이지에서 유저 정보 조회

image
  • 관리자의 경우 유저 정보를 api를 통해 조회할 수 있도록 구현했습니다.
image
  • 관리자 권한이 없다면 역시 403 에러를 반환하도록 설계했습니다.

비회원 예매 시 유저(비회원)의 권한을 USER로 저장하도록 구현

image
  • 비회원 예매를 시도하였고, response로 userId: 4인 유저가 생성되었음을 알 수 있습니다.
image
  • DB 조회 결과 userId: 4인 유저는 권한이 USER임을 확인하였습니다.

소셜 회원가입/로그인 시 토큰에 ROLE을 부여하고 반환하도록 구현

image
  • 소셜 회원가입의 경우 서비스의 회원으로 가입을 한 것이기 때문에 Member 역할을 부여하도록 설계했습니다.
  • 추후 다시 소셜 로그인시 해당 role은 유지되며, 해당 role에 속한 인증객체로 권한을 부여받아 토큰을 재생성하게 됩니다.
image image
  • 회원가입한 회원은 Member로 역할이 저장됨을 확인했습니다.

어드민 권한 부여

image image
  • 회원가입한 회원의 역할을 ADMIN으로 업데이트 시켜주었고, 다시 소셜로그인을 시도했을 때 역할이 ROLE_ADMIN으로 바뀐것을 확인할 수 있습니다
  • 해당 토큰을 통해 /admin/** 의 경로에 접근할 수 있습니다.

Uncompleted Tasks 😅

  • 캐러셀 업로드 PUT API

현재 PR 볼륨이 커서 해당 작업은 새롭게 issue 파고, pr 올리겠습니다!

To Reviewers 📢

  • admin으로 DB에서 권한을 변경할 경우, 기존 발급받은 토큰은 admin 권한이 아닌 member 권한이 유지됩니다.
  • 따라서 admin 권한을 가지고 싶다면, 새롭게 토큰을 발급을 받아야 한다는 점 잊지마세요!!

hoonyworld and others added 30 commits August 31, 2024 01:38
* [#200] fix(ScheduleNumber): 10회차까지 추가

* [#200] fix(PerformanceModifyService): 공연 회차 수정 중 회차 추가 시 검증 로직 10회차까지 허용 가능하도록 변경

* [#200] feat(PerformanceErrorCode): MAX_SCHEDULE_LIMIT_EXCEEDED message 수정
… 명시 (#203)

* [#202] feat(WebConfig): PATCH 메서드 추가 및 allowedOriginPatterns에 도메인 명시

* [#202] feat(WebConfig): 클라이언트 localhost 주소 추가

* [#202] fix(WebConfig): 문자열 오타 수정
* [#204] fix(SuccessResponse): 메서드에 제네릭 타입 명시

* [#204] fix(BookingController): 회원 예매 조회 response 타입 일치하도록 수정
- service에서 application으
- 리프레시 토큰이 만료된 경우, generateAccessTokenFromRefreshToken 메서드에서 만료 에러 반환을 추가.
- 사용자의 Role (Admin 또는 Member)에 따라 각각의 권한으로 새로운 Access Token을 발급하도록 수정.
- generateLoginSuccessResponse 메서드에서 로그인 성공 시 사용자 역할에 따라 인증 객체를 생성하고, Access 및 Refresh 토큰을 발급.
- Spring Security의 UsernamePasswordAuthenticationToken을 상속하여, 관리자 권한을 포함한 인증 객체 생성 가능.
- JWT 토큰 발급 시 사용자 정보(memberId)와 역할(role)을 포함한 클레임 생성.
- getMemberIdFromJwt 및 getRoleFromJwt 메서드를 통해 토큰에서 사용자 정보와 역할을 추출하는 기능 구현.
- "ROLE_" 접두사를 제거한 후, 역할을 추출하여 Role Enum에 맞게 변환하는 로직 추가.
…한 presignedUrl을 발급하는 응답 DTO 역할에 맞게 레코드 rename
…ce로 rename 및 ifPresentOrElse로 가독성 개선
@hoonyworld hoonyworld changed the title [feat] #190 - 어드민 기능 제작 [feat] #190 - 어드민 기능 구현 Sep 9, 2024
@hoonyworld hoonyworld changed the title [feat] #190 - 어드민 기능 구현 [feat] #190 - admin 기능 구현 Sep 9, 2024
Copy link
Collaborator

@hyerinhwang-sailin hyerinhwang-sailin left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

큰 작업이었을텐데 정말 고생많으셨습니다!
memberService도 세분화해서 분리하고 이름을 수정하니 가독성이 더 좋네요~

@hoonyworld hoonyworld merged commit f7de0d7 into develop Sep 10, 2024
1 check passed
@hoonyworld hoonyworld deleted the feat/#190 branch September 12, 2024 06:43
@hoonyworld hoonyworld changed the title [feat] #190 - admin 기능 구현 [feat] #190 - Admin 기능 구현 Sep 26, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

[feat] 어드민 기능 생성
2 participants