인프런 커뮤니티 질문&답변

Peter Choi님의 프로필 이미지

작성한 질문수

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

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

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

작성

·

342

·

수정됨

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

 

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

답변 3

1

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

IDE : IntelliJ

  • @P 없이 정상 실행

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

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

  • @P 포함 시 정상 실행

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

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

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

     

  • Build IntelliJ IDEA 일 경우 403 에러

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

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

Peter Choi님의 프로필 이미지
Peter Choi
질문자

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

1

정수원님의 프로필 이미지
정수원
지식공유자

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

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

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

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

Peter Choi님의 프로필 이미지
Peter Choi
질문자

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

감사합니다!

0

Peter Choi님의 프로필 이미지
Peter Choi
질문자

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

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

정수원님의 프로필 이미지
정수원
지식공유자

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

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