Skip to content

Commit

Permalink
[6주차 review PR] (#64)
Browse files Browse the repository at this point in the history
* DOCS : 버전 명시

* 1주차 최종 코드 (#7)

* ExceptionAdvice 정의 (#4)

* build: lombok 추가
#3

* chore: build.gradle 정리
#3

* chore: ApplicationError 정의
#3

* chore: BusinessError 정의
#3

* feat: ExceptionAdvice 정의
- BusinessError
- ApplicationError
#3

* chore: exception -> error 패키지명 수정
#3

* chore: error logging 방식 수정
- [] : {}
#3

* DOCS : PR template 업데이트

---------

Co-authored-by: 정지민 <[email protected]>
Co-authored-by: amm0124 <[email protected]>

* feat: Member 엔티티 생성 #11

* feat: MemberProfile 엔티티 생성 #11

* feat: LoginType 및 MemberType 생성 #11

* feat: MemberProfile 멤버 변수 추가 #11

* feat: Farm Entity 생성
#2

* feat: Farm Entity 수정
- 빌더패턴 적용
- 상태를 나타내는 값 설정
#2

* feat: FarmManageService 정의
- 등록 인터페이스만 정의
#2

* feat: FarmRegisterRequest 생성
#2

* feat: FarmStatus 정의
- 회의 따로 필요함.
#2

* feat: FarmMangeController 생성
- 등록 API 생성
#2

* feat: FarmRepository 생성
#2

* feat: FarmMangeController 수정
- ResponseEntity 리턴한다
#2

* feat: FarmMangeController 수정
- ResponseEntity 리턴한다
#2

* feat: FarmResponse 생성
#2

* feat: 농장 단건 조회 API 생성
#2

* refactor: 함수 네이밍 수정
- getFarm -> getFarmByFarmId
#2

* feat: 일반 로그인 구현 #11

* feat: 로그인 에러 처리 #11

* docs: yml 파일 작성 #11

* refactor: 판매자 & 일반 유저 API 분리
- Seller: 판매자
#2

* refactor: 판매자 & 일반 유저 API 분리
- Seller: 판매자
#2

* feat: Application 코드 어노테이션 추가 #11

* refactor: JwtUtil을 JwtProvider로 변경 및 코드 추가 #11

* refactor: MemberType 재정의 #11

* feat: product 생성 삭제 수정

* feat: category crud

* refactor: MemberType -> Role 이름 변경 #11

* refactor: seller -> farmer
#2

* refactor: endpoint 수정
#2

* chore: 주석 제거
#2

* feat: 농장 설명 추가
#2

* feat: application-secret.yml ignore
#2

* build: mysql 종속성 추가
- 8.0.33
#2

* feat: 농장 목록 조회
#2

* feat: 예시 에러 삭제
#2

* feat: 농장 업데이트
#2

* feat: FarmResponse 수정
- description 추가
#2

* docs: application-secret 작성 #11

* feat: Redis 설정 및 config 작성 #11

* feat: RedisService 코드 작성 #11

* feat: RefreshToken 작성 #11

* feat: RefreshTokenService 작성 #11

* feat: removeMemberRefreshToken 및 getTokenResponse 구현 #11

* refactor: Member 멤버변수 snsAuthId -> kakaoAuthId 로 수정 #11

* feat: 구매자 로컬 회원가입, 로그아웃 구현 #11

* refactor: 회원가입 로직 수정 #11

* feat: 농부 승격 로직 구현 #11

* refactor: 지민님 피드백 수정

* refactor: utf-8명시 #11

* refactor: 회원가입 endpoint명 변경 #11

* refactor: 토큰 유효성 검사 에러 로그 단순화 #11

* 로그인 삭제 및 BusinessError 구분 #11

* 농부 자격 증명 에러 수정 #11

* refactor: 멤버 소프트 딜리트 쿼리 수정 #11

* refactor: MemberProfile의 isSuspended를 isBanned로 네이밍 변경 #11

* refactor: MemberService 리팩토링 #11

* chore: 회원가입, 로그아웃, 농부 승격 auth 폴더로 이동 #11

* chore: LoginRequest 위치 변경 #11

* refactor: 상품 enum 삭제

* chore: 린트 적용 및 잘못된 수정사항 제거
#17

* refactor: 회원가입 엔드포인트 수정, .gitignore 파일 수정 #21

* feat: Redis 블랙리스트 로직 추가 #21

* feat: AuthService 로그아웃 로직 수정 #21

* feat: AuthController 로그아웃 로직 수정 #21:

* feat: JwtProvider 토큰 유효성 검사 로직 수정 #21

* refactor: AuthService 리팩토링 #21

* refactor: RefreshToken 유효성 검사 로직 수정 #21

* refactor: RefreshToken 커스텀 에러 수정 #21

* refactor: RedisService 리팩토링 #21

* refactor: JwtUtil 리팩토링 #21

* refactor: 농부로 승격 로직 위치 변경 #21

* refactor: 사용자 리프레시 토큰 제거 로직 리팩토링 #21

* AuthService 및 RefreshTokenService 리팩토링 #24

* refactor: Jwt claims에 role과 email이 들어가도록 수정 #24

* refactor: 시크릿 파일 삭제 #21

* refactor: 시크릿 파일 삭제 #21

* refactor: 어노테이션 일부 수정
- RequiredArgsConstructor
- Comment
- SQLSelect 삭제
#13

* refactor: 2차 수정
RequiredArgsConstructor 사용
PathVariable camel case로 변경

* feat : Member Entity 생성자 추가

* refactoring : ROLE 객체 get Authority(String) 메서드 추가 (Overriding)

* feat : security filter chain을 위한 config

* feat : User detail 추가

* feat : security에서 사용할 객체 spring bean으로 등록

* feat : username password 기반 로그인 필터

* feat : jwt 인증 필터

* build : oauth2.0 client 의존성 추가

* 농장 예약 가능 시간대 등록 및 조회 (#30)

* feat: FarmSchedule 추가
#13

* refacto: userId로 네이밍 수정
#13

* feat: secret 내리자...

* feat:FarmSchedule 도메인 추가
- 스케쥴 추가
- 스케쥴 조회
#13

* refactor: AllArgsConstructor -> RequiredArgsConstructor
#13

* refactor: Enumerated추가

* refactor: where/sqlselect 제거

* feat: 이미 농장이 있는 경우 새로운 농장 등록을 막는다

* bug: 농장 조회 기능 에러 수정
- 쿼리로 삭제된 농장 조회 필터링
-  JPA 메소드 수정
#13

* bug: 농장 조회 기능 에러 수정
- 쿼리로 삭제된 농장 조회 필터링
-  JPA 메소드 수정
#13

* feat: 농장 스케쥴 등록
- 시작 날짜, 종료 날짜, 요일 선택시 추가 가능
#13

* feat: 농장 예약 가능날짜 조회
#13

* chore: 필요없는 코드 정리
#13

* chore: 필요없는 코드 정리
#13

* refactor: schedule 도메인 분리
- 생각보다 너무 커져서 Farm 안에 집어 넣어버렸습니다
#13

* refactor: schedule controller 분리
#13

* refactor: schedule controller 분리
#13

* refactor: now() -> current_timestamp
#13

* refactor: userId -> memberId
#13

* refactor: 기간 범위의 스케쥴 한번에 가져와서 비교하도록 수정
#13

* feature: 체험 비용 추가
#13

* feat: 농장 스케쥴 등록 validation 추가
#36

* feat: 농장 스케쥴 등록 validation 추가
#36

* 충돌 해결

* feat: product review 생성 조회

* @where, @SQLSelect 어노테이션을 JPA 방식으로 변환 (#38)

* refactor: category 위치 이동
#36

* refactor: RequestMapping으로 묶음
#36

* refactor: Member 도메인 일부 수정
- SQLSelect 삭제
- isDeleted -> deletedAt
#36

* feature: 상품 등록 시 validation
- 농부인가?
- 존재하는 카테고리인가?
#36

* feature: 상품 단건 조회 & 다건 조회
#36

* feature: 상품 단건 조회 & 다건 조회
#36

* refactor: 요청 방식 수정
- 리소스 기반으로 표현
#36

* refactor: 요청 방식 수정
- 리소스 기반으로 표현
#36

* refactor: 파일 위치 수정
#36

* refactor: 파일 위치 수정
#36

* refactor: 중복코드 삭제
#36

* fix: 수량 업데이트 동작 안하는 부분 수정
#36

* feature: 상품 단건 조회
- 나중에 DTO는 바껴야할듯
#36

* feature: 회원 조회 조건 수정
- DeletedAtIsNull
#36

* feat: category - product 연관관계 추가

* feat: 카테고리 내 상품 조회

* fix: 빠진 파일 추가

* style: 아 맞다 정렬

* feat: 상품리뷰 - 상품리뷰사진 연관 관계 생성

* refactor: 평균 평점을 리뷰 추가할 때 계산하도록 변경

* feat: 충돌 해결

* feat: 수정사항 삭제

* fix : bug 수정

* S3 설정 및 Presigned URL 관련 메소드 정의 (#51)

* feat: S3 Properties 설정
- S3Config 정의
- s3Presigner Bean으로 관리
#32

* feat: S3PresignedUrl
- Presgiend Url 발급 메소드
#32

* refactor: AwsProperties 네이밍 수정
#32

* refactor: 패키지 분리
- aws/s3 분리
#32

* refactor: EncryptionUtil 분리
#32

* S3 presignedUrl 테스트 코드 작성 #32

* feat: 테스트 API
#32

---------

Co-authored-by: 정진택 <[email protected]>

* feat: review 생성

* style: 아 맞다 정렬

* B
style: 아 맞다 정렬

* feat: review 생성

* Feature/issue 49 - 인증 및 인가 (#56)

* refactor: LoginRequest -> SignUpRequest 네임 변경 #39

* refactor: 회원가입 토큰생성 로직 삭제 #39

* refactor: 로그아웃 로직 삭제 #39

* chore: JwtUtil auth 폴더로 이동 #39

* JwtUtil 리팩토링 및 claims에 id, Type 추가 #39

* refactor: JwtUtil 리팩토링 #39

* feat : OAuth2 response interface 구현

* refactoring : member entity 변수 명 변경 및 builder 추가

* refactoring : member profile 기본 생성자 추가

* refactoring : member repository 메서드

* refactoring : jwt 검증 필터

* refactoring : 패키지 구조 변경을 위한 삭제

* refactoring : 로그아웃 필터 주석처리

* refactoring : User Detail 구현체 Oauth2User도 구현 받도록 변경

* feat : 회원가입 패키지 추가

* refactoring : username password 필터 리팩토링
- 메서드 변경

* refactoring : security 설정 변경

* feat : refresh token 관련 (reissue, refresh) 패키지 추가

* refactoring : 안 쓰는 request 삭제

* feat : blacklist 패키지 구조

* feat : 소셜 로그인 user detail service 구현 및 success handler(토큰 발급)

* feat : 회원가입 response dto 구현

* refactoring : jwt util 객체 변경

* delete : 안 쓰는 response import 삭제

* delete : 안 쓰는 response import 삭제

* refactoring : test를 위한 경로 open

* refactor: Member엔티티 리팩토링 #49

* refactor: MemberRepository 안쓰는 메소드 삭제 #49

* refactor: 토큰 reissue 리팩토링 #49

* refactor: 리프레시 토큰 저장 인터페이스 구현하여 분리  #49

* refactor: JwtUtil 수정 #49

* refactor: 블랙리스트 인터페이스 구현하여 분리 #49

* feat: jpa 토큰 만료 로직 추가 #49

* refactor: 레디스 에러 핸들링 공통화 #49

* feat: jpa 토큰 저장 스케쥴러 구현 #49

* feat: blacklist 및 refreshtoken config 설정 #49

* refactor: JwtUtil 수정 #49

* refactor: 빈 이름 중복 해결 #49

* Delete src/test/java/poomasi/global/config/s3 directory

* docs: build.gradle 중복 제거 #49

* refactor: 리프레시 토큰 key 변수 네임 변경 #49

* refactor:레디스, jpa 전환  프로파일 -> application 속성 이용으로 변경 #49

* fix: blacklist key->tokenKey로 변경 #49

* feat : username password authentication filter 완료

* feat : jwt filter 완성

* feat : jwt token을 위한 utility 수정

* feat : oauth2 응답을 위한 response dto 및 인터페이스 생성

* refactoring : member profile 변경

* refactoring : 회원가입 서비스 변경

* feat : 인가 확인 테스트 컨트롤러 작성

* feat : 로그아웃 성공 핸들러

* feat : oauth2 성공 핸들러

* refactoring : bean generator 수정 및 config 수정

* feat : logout filter 작성

* refactoring : username password 필터 수정
- username, password를 받아올 때, object mapper 사용

* refactoring : jwt util 수정

* refactoring : OAuth2 user detail 및 response 구현

* feat : 로그아웃 필터 작성

* refactoring : user detail get Member 추가

* refactoring : 회원가입 코드 변경

* refactoring : security bean, config 수정
- jwt util 의존성 추가

* feat : 로그아웃 handler 구현

* refactoring : jwt 필터 수정

* feat : test controller 구현

* conflict : conflict 해결 및 test controller 구현

* merge : master merge를 위한 commit. conflict 해결

* refactoring : redis global 이동

* refactoring : member profile column 추가
- 상세 주소, x좌표, y좌표

* refactoring : sout -> log 변경

* refactor: JwtUtil 약간 수정#49

* feat : 모든 경로에 대해서 security 적용 해제(임시)

---------

Co-authored-by: 정진택 <[email protected]>
Co-authored-by: amm0124 <[email protected]>

* 예약 도메인을 생성한다  (#54)

* feat: Reservation 생성
- Farm
- Member
- FarmSchedule
#32

* refactor: Farm 도메인 일부 분리
#32

* feat: Reservation Service 구현
- get...메소드들
- 예약 생성 인터페이스
#32

* feat: 농장 예약 기능 구현
- 농장 예약
- 열린 농장인가?
- 유효한 농장인가?
- 유효한 스케쥴인가?
#31

* feat: 농장 조회
- 관리자나 자신의 농장만 조회 가능하도록 수정
#31

* feat: 농장 조회
- 관리자나 자신의 농장만 조회 가능하도록 수정
#31

* feat: 예약 취소
- 방문 3일 전까지 예약 취소 가능
#31

* fix: ADMIN은 가능하도록 수정
#31

* feature: 예약 조회
#31

* 위시리스트를 생성한다 (#58)

* feat: product review 생성 조회

* feat: category - product 연관관계 추가

* feat: 카테고리 내 상품 조회

* fix: 빠진 파일 추가

* style: 아 맞다 정렬

* feat: 상품리뷰 - 상품리뷰사진 연관 관계 생성

* refactor: 평균 평점을 리뷰 추가할 때 계산하도록 변경

* feat: 충돌 해결

* feat: 수정사항 삭제

* feat: review 생성

* style: 아 맞다 정렬

* feature: 위시리스트 등록
- 재고와 무관하게 경우 위시리스트 가능하게
#57

* feature: 위시리스트 조회
#57

---------

Co-authored-by: canyos <[email protected]>
Co-authored-by: canyos <[email protected]>

* 위시리스트를 생성한다 (#58)

* feat: product review 생성 조회

* feat: category - product 연관관계 추가

* feat: 카테고리 내 상품 조회

* fix: 빠진 파일 추가

* style: 아 맞다 정렬

* feat: 상품리뷰 - 상품리뷰사진 연관 관계 생성

* refactor: 평균 평점을 리뷰 추가할 때 계산하도록 변경

* feat: 충돌 해결

* feat: 수정사항 삭제

* feat: review 생성

* style: 아 맞다 정렬

* feature: 위시리스트 등록
- 재고와 무관하게 경우 위시리스트 가능하게

* feature: 위시리스트 조회

---------

Co-authored-by: canyos <[email protected]>
Co-authored-by: canyos <[email protected]>

fix: JoinColumn 수정

* fix : jwt filter 버그 수정
- 멤버 객체에서 id가 조회되지 않는 버그 수정

---------

Co-authored-by: amm0124 <[email protected]>
Co-authored-by: 정지민 <[email protected]>
Co-authored-by: 정진택 <[email protected]>
Co-authored-by: stopmin <[email protected]>
Co-authored-by: canyos <[email protected]>
Co-authored-by: canyos <[email protected]>
  • Loading branch information
7 people authored Oct 14, 2024
1 parent 0ad88da commit 347b1fb
Show file tree
Hide file tree
Showing 136 changed files with 4,748 additions and 26 deletions.
24 changes: 8 additions & 16 deletions .github/PULL_REQUEST_TEMPLATE.md
Original file line number Diff line number Diff line change
@@ -1,23 +1,15 @@
## TO-DO
## 해결하려는 문제가 무엇인가요?

어떤 것을 하셨나요?
어떤 것 작업했는지 작성해주세요! 아래는 예시입니다.
자세하면 자세할수록 좋습니다!
- close #

- [ ] build.gradle 의존성 추가
- [ ] login controller 구현
- [ ] 파이팅 ~
## 어떻게 해결했나요?

## 추가 정보
-

하고 싶은 말이 있으면 작성해주세요!
## 코드 리뷰시 요청 사항

## 리뷰어
-

꼭 봐줬으면 하는 사람이 있으면 @<< 를 통해서 태그!


## 관련 이슈 닫기

closes (#이슈 번호)
## 더 하고 싶은 말

-
4 changes: 4 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -38,3 +38,7 @@ out/

### Mac OS ###
.DS_Store

## applicaion-secret
application-secret.yml

7 changes: 6 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
@@ -1,2 +1,7 @@
# Team10_BE
10조 백엔드
10조 백엔드

## 사용한 버전

Gradle JVM : 22.0.2
spring boot : 3.3.1
45 changes: 38 additions & 7 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -18,22 +18,53 @@ repositories {
}

dependencies {
// Spring Boot Basic
implementation 'org.springframework.boot:spring-boot-starter-jdbc'
implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
implementation 'org.springframework.boot:spring-boot-starter-web'
runtimeOnly 'com.h2database:h2'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
testRuntimeOnly 'org.junit.platform:junit-platform-launcher'
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
implementation 'org.springframework.boot:spring-boot-starter-validation'
implementation 'io.jsonwebtoken:jjwt-api:0.11.5'
runtimeOnly 'io.jsonwebtoken:jjwt-impl:0.11.5'
runtimeOnly 'io.jsonwebtoken:jjwt-jackson:0.11.5'

// mysql
implementation 'mysql:mysql-connector-java:8.0.33'

// Spring Security
implementation 'org.springframework.security:spring-security-crypto:5.7.1'
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
implementation 'org.springframework.boot:spring-boot-starter-oauth2-client'
implementation 'org.springframework.boot:spring-boot-starter-security'
implementation 'org.springframework.boot:spring-boot-starter-actuator'


// H2 Database
runtimeOnly 'com.h2database:h2'

// JSON
implementation 'org.json:json:20210307'
implementation 'com.google.code.gson:gson:2.10.1'

// JWT
implementation 'io.jsonwebtoken:jjwt-api:0.11.5'
runtimeOnly 'io.jsonwebtoken:jjwt-impl:0.11.5'
runtimeOnly 'io.jsonwebtoken:jjwt-jackson:0.11.5'

// Lombok
compileOnly 'org.projectlombok:lombok'
annotationProcessor 'org.projectlombok:lombok'

// Test
testImplementation 'org.springframework.boot:spring-boot-starter-test'
testRuntimeOnly 'org.junit.platform:junit-platform-launcher'

// Redis
implementation 'org.springframework.boot:spring-boot-starter-data-redis'

// AWS
implementation(platform("software.amazon.awssdk:bom:2.27.21"))
implementation("software.amazon.awssdk:s3")

}


tasks.named('test') {
useJUnitPlatform()
}
5 changes: 4 additions & 1 deletion src/main/java/poomasi/Application.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,11 @@

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration;
import org.springframework.data.jpa.repository.config.EnableJpaAuditing;

@SpringBootApplication
@EnableJpaAuditing
@SpringBootApplication(exclude = SecurityAutoConfiguration.class)
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
package poomasi.domain.auth.config;

import jdk.jfr.Description;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.security.web.servlet.util.matcher.MvcRequestMatcher;
import org.springframework.web.servlet.handler.HandlerMappingIntrospector;
import poomasi.domain.auth.token.blacklist.service.TokenBlacklistService;
import poomasi.domain.auth.token.refreshtoken.service.TokenStorageService;
import poomasi.domain.auth.token.util.JwtUtil;
import poomasi.domain.auth.token.refreshtoken.service.TokenRedisService;
import poomasi.domain.member.service.MemberService;

@RequiredArgsConstructor
@Configuration
public class SecurityBeanGenerator {

private final TokenStorageService tokenStorageService;
private final MemberService memberService;
private final TokenBlacklistService tokenBlacklistService;

@Bean
@Description("AuthenticationProvider를 위한 Spring bean")
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}

@Bean
@Description("open endpoint를 위한 spring bean")
MvcRequestMatcher.Builder mvc(HandlerMappingIntrospector introspector) {
return new MvcRequestMatcher.Builder(introspector);
}

@Bean
JwtUtil jwtUtil(){
return new JwtUtil(tokenBlacklistService,
tokenStorageService,
memberService);
}

}
142 changes: 142 additions & 0 deletions src/main/java/poomasi/domain/auth/config/SecurityConfig.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,142 @@
package poomasi.domain.auth.config;

import lombok.AllArgsConstructor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Description;
import org.springframework.http.HttpMethod;
import org.springframework.security.authentication.AuthenticationManager;
import org.springframework.security.config.annotation.authentication.configuration.AuthenticationConfiguration;
import org.springframework.security.config.annotation.method.configuration.EnableMethodSecurity;
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.configurers.AbstractHttpConfigurer;
import org.springframework.security.config.http.SessionCreationPolicy;
import org.springframework.security.web.SecurityFilterChain;
import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter;
import org.springframework.security.web.authentication.logout.LogoutFilter;
import org.springframework.security.web.authentication.logout.LogoutHandler;
import org.springframework.security.web.servlet.util.matcher.MvcRequestMatcher;
import poomasi.domain.auth.security.filter.CustomUsernamePasswordAuthenticationFilter;
import poomasi.domain.auth.security.filter.JwtAuthenticationFilter;
import poomasi.domain.auth.security.handler.CustomSuccessHandler;
import poomasi.domain.auth.security.userdetail.OAuth2UserDetailServiceImpl;
import poomasi.domain.auth.security.handler.*;
import poomasi.domain.auth.security.userdetail.UserDetailsServiceImpl;
import poomasi.domain.auth.token.util.JwtUtil;


@AllArgsConstructor
@Configuration
@EnableWebSecurity
@EnableMethodSecurity(securedEnabled = true , prePostEnabled = false) // 인가 처리에 대한 annotation
public class SecurityConfig {

private final AuthenticationConfiguration authenticationConfiguration;
private final JwtUtil jwtUtil;
private final MvcRequestMatcher.Builder mvc;
private final CustomSuccessHandler customSuccessHandler;
private final UserDetailsServiceImpl userDetailsService;


@Autowired
private OAuth2UserDetailServiceImpl oAuth2UserDetailServiceImpl;

@Bean
public AuthenticationManager authenticationManager(AuthenticationConfiguration configuration) throws Exception {
return configuration.getAuthenticationManager();
}

@Description("순서 : Oauth2 -> jwt -> login -> logout")
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {

//form login disable
http.formLogin(AbstractHttpConfigurer::disable);

//basic login disable
http.httpBasic(AbstractHttpConfigurer::disable);

//csrf 해제
http.csrf(AbstractHttpConfigurer::disable);

//cors 해제
http.cors(AbstractHttpConfigurer::disable);

//세션 해제
http.sessionManagement((session) -> session
.sessionCreationPolicy(SessionCreationPolicy.STATELESS));

//기본 로그아웃 해제
http.logout(AbstractHttpConfigurer::disable);

/*
// 기본 경로 및 테스트 경로
http.authorizeHttpRequests((authorize) -> authorize
.requestMatchers(HttpMethod.GET, "/api/farm/**").permitAll()
.requestMatchers(HttpMethod.GET, "/api/product/**").permitAll()
.requestMatchers(HttpMethod.GET, "/api/review/**").permitAll()
.requestMatchers("/api/sign-up", "/api/login", "api/reissue").permitAll()
.requestMatchers("/api/need-auth/**").authenticated()
.anyRequest().
authenticated()
);*/


http.authorizeHttpRequests((authorize) -> authorize
.requestMatchers("/**").permitAll()
.requestMatchers("/api/auth-test/**", "/api/cart/**").authenticated()
.anyRequest()
.authenticated()
);

/*
로그아웃 필터 등록하기
LogoutHandler[] handlers = {
new CookieClearingLogoutHandler(),
new ClearAuthenticationHandler()
};
CustomLogoutFilter customLogoutFilter = new CustomLogoutFilter(jwtUtil, new CustomLogoutSuccessHandler(), handlers);
customLogoutFilter.setFilterProcessesUrl("/api/logout");
customLogoutFilter.
http.addFilterAt(customLogoutFilter, LogoutFilter.class);
http.logout( (logout) ->
logout.
logoutSuccessHandler(new CustomLogoutSuccessHandler())
.addLogoutHandler(new CookieClearingLogoutHandler())
.addLogoutHandler(new ClearAuthenticationHandler())
);
*/

/*
oauth2 인증은 현재 해제해놨습니다 -> 차후 code를 front에서 어떤 경로로 받을 것인지
아니면 kakao에서 바로 redirect를 백엔드로 할 지 정해지면
processing url 작성하겠습니다
http
.oauth2Login((oauth2) -> oauth2
.userInfoEndpoint((userInfoEndpointConfig) -> userInfoEndpointConfig
.userService(oAuth2UserDetailServiceImpl))
.successHandler(customSuccessHandler)
);
*/
http.oauth2Login(AbstractHttpConfigurer::disable);

CustomUsernamePasswordAuthenticationFilter customUsernameFilter =
new CustomUsernamePasswordAuthenticationFilter(authenticationManager(authenticationConfiguration), jwtUtil);
customUsernameFilter.setFilterProcessesUrl("/api/login");

http.addFilterAt(customUsernameFilter, UsernamePasswordAuthenticationFilter.class);
http.addFilterBefore(new JwtAuthenticationFilter(jwtUtil, userDetailsService), UsernamePasswordAuthenticationFilter.class);
//http.addFilterAfter(customLogoutFilter, JwtAuthenticationFilter.class);

return http.build();
}

}




53 changes: 53 additions & 0 deletions src/main/java/poomasi/domain/auth/security/AuthTestController.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
package poomasi.domain.auth.security;


import jdk.jfr.Description;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.access.annotation.Secured;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import poomasi.domain.auth.security.userdetail.UserDetailsImpl;
import poomasi.domain.member.entity.Member;

@Slf4j
@Description("접근 제어 확인 controller")
@RestController
public class AuthTestController {

@Autowired
private AuthTestService authTestService;

@Secured("ROLE_CUSTOMER")
@GetMapping("/api/auth-test/customer")
public String customer() {
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
Object impl = authentication.getPrincipal();
Member member = ((UserDetailsImpl) impl).getMember();

log.info("email : " + member.getEmail());
log.info("member : " + member.getId());

return "hi. customer";
}

@Secured("ROLE_FARMER")
@GetMapping("/api/auth-test/farmer")
public String farmer() {
return "hi. farmer";
}

@GetMapping("/api/auth-test")
public String needAuth() {
return "auth";
}

@GetMapping("/api/auth-test/test")
public String Test(){
authTestService.Test();
return "Success";
}

}
25 changes: 25 additions & 0 deletions src/main/java/poomasi/domain/auth/security/AuthTestService.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
package poomasi.domain.auth.security;

import lombok.extern.slf4j.Slf4j;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.stereotype.Service;
import poomasi.domain.auth.security.userdetail.UserDetailsImpl;
import poomasi.domain.member.entity.Member;

@Slf4j
@Service
public class AuthTestService {

public String Test(){
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
Object impl = authentication.getPrincipal();
Member member = ((UserDetailsImpl) impl).getMember();

log.info("member : " + member.getEmail());
log.info("member : " + member.getId().toString());

return "SUCCESS";
}

}
Loading

0 comments on commit 347b1fb

Please sign in to comment.