inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

스프링 시큐리티 완전 정복 [6.x 개정판]

메서드 기반 권한 부여 - @PreAuthorize, @PostAuthorize

섹션.8 메서드 기반 권한 부여 @PreAuthorize

574

Peter Choi

작성한 질문수 6

0

안녕하세요? 섹션8. 메서드 기반 권한 부여 강의 보다가 잘 안되는 부분이 있어서 질문 드립니다! (16분 쯤에 설명 나오는 부분입니다!)

 

@GetMapping("/user/{id}")
@PreAuthorize("#id == authentication.name")
public String authentication(@PathVariable(name = "id") String id){
    return id;
}

해당 강의에서 user 로 로그인 시 위 url 로 접근이 가능했는데, 똑같이 해봤는데 403 이 떴습니다.
혹시나 해서 공유해주신 github 프로젝트로 해당 branch 로 체크아웃했더니 같은 현상이 나타납니다.

이것저것 시도해보다가 스프링 공식페이지에서 @P 어노테이션에 대한 설명이 있길래 아래와 같이 도입해봤더니 정상동작합니다.

@GetMapping("/user/{id}")
@PreAuthorize("#id == authentication.name")
public String authentication(@P("id") @PathVariable(name = "id") String id){
    return id;
}

https://docs.spring.io/spring-security/reference/servlet/authorization/method-security.html

 

강의 하실 때보다 시큐리티 버젼이 또 올라가서 안되는 부분이 생긴 것일까요?
아니면 제가 어떤 부분을 놓치고 있는걸까요? ㅠ

spring spring-boot spring-security security web-security @preauthorize

답변 3

1

근것

정확한 원인과 차이는 모르겠지만 일단 위 상황에 대해서 [실행 가능한 상황] vs [403 에러가 발생하는 상황]을 비교해봤습니다.

IDE : IntelliJ

  • @P 없이 정상 실행

    • 테스트용 새 프로젝트 (의존성 : web, security)

    • 강의에 공유된 github 프로젝트

  • @P 포함 시 정상 실행

    • 위 에러가 발생하는 프로젝트

결과부터 말씀드리면 Build 방식에 따라 차이가 발생했습니다.

  • Build Gradle 일 경우 @P 없이 정상 실행

     

  • Build IntelliJ IDEA 일 경우 403 에러

두 빌드 방식의 차이가 증분 빌드 여부라곤 하는데 정확한 이유는 모르겠네요...Build IntelliJ IDEA할때 빌드 안되는 부분이 있나봅니다...

일단 강의 내용대로 실행을 원하시는 분들을 위해 글 남겼습니다.

0

Peter Choi

전혀 감을 못잡았었는데, 이렇게 확인해주셔서 감사합니다! :)

1

정수원

버전에 따른 차이는 아닌 것 같습니다.

강의에서 설명하고 있는 예제를 직접 실행하면 정상적으로 동작하고 있습니다.

코드가 복잡하지 않기 때문에 특별한 문제는 없어 보이는데 권한 관련 다른 문제가 있을 수 도 있습니다.

오타나 기타 설정 등을 확인해 주시기 바랍니다.

0

Peter Choi

네, 다른 부분들도 한번 확인해보겠습니다.

감사합니다!

0

Peter Choi

추가로, @PostAuthorize 관련해서 어떻게 사용하는지는 이해가 가는데 어떤 상황에 적용하면 좋을 지 use case 가 잘 떠오르지 않네요.

보통은 @PreAuthorize 로 설정할 것 같은데, 혹시 @PostAuthorize 를 꼭 사용해야만 하는 use case 가 있을까요?

1

정수원

@PostAuthorize 는 예를 들어서 요청 후 어떤 결과를 받아와야 하는데 게시물을 올린 본인것만 가져와야 할 경우 게시물에 저장된 아이디와 인증받은 아이디를 서로 비교해서 일치하면 가져오고 일치하지 않으면 가져오지 못하는 경우를 들 수 있습니다

즉 결과 데이터를 필터링 하고자 할 때 사용합니다.

로그아웃-logout()-2 강에서 겟방식 로그아웃 호출 후 화면이동 질문입니다.

0

25

2

단원별 소스코드

0

55

2

CustomAuthenticationProvider 추가 관련 문의

0

66

2

AOP 의존성 명칭 변경

0

59

1

빈 1개 등록 시 다른 해결 방법

0

61

1

@Bean으로 AuthenticationProvider를 등록 시 http.authenticationProvider 함수를 이용해서 추가해줘야되나요?

0

84

2

OIDC의 id token에 담긴 데이터에 대해

0

69

1

loginPage("/loginPage") 질문드립니다.

0

65

1

@EnableWebSecurity

0

143

1

트랜잭션과 롤백

0

96

1

68. 인증 이벤트 - AuthenticationEventPublisher 활용 강좌 음성 문제

0

84

2

AuthenticationManager 사용 방법

0

144

2

HttpSecurity.authorizeHttpRequests() - 2 강의 부분에 대한 질문

0

98

2

spring security 6.3에서는 HttpSecurity가 만들어지기 전 WebSecurity가 먼저 만들어지는게 맞나요??

0

186

1

init(B Builder), configure(B builder) 에 대하여 질문 드립니다.

0

102

2

메타 주석 질문

0

65

1

동시세션제어 기능에서 로그아웃하기

0

140

3

로그인 후, redirect 에서 error

0

137

3

Session 생성 타이밍에 대한 질문

0

79

2

강의 참고 내용을 개발 로그로 작성해도 될지 문의드립니다.

0

129

2

customAuthentication 관련

0

123

2

authenticationManagerBuilder 주입받은거 vs 만든 거

0

107

1

UserDetailsService()에서 UserDetail이 아닌 타입을 반환할 수 있나요?

0

97

1

9:28 패턴 3의 경우 마지막으로 설정한 것만 적용되는 것 같습니다.

0

155

2