작성
·
347
·
수정됨
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할때 빌드 안되는 부분이 있나봅니다...
일단 강의 내용대로 실행을 원하시는 분들을 위해 글 남겼습니다.
1
버전에 따른 차이는 아닌 것 같습니다.
강의에서 설명하고 있는 예제를 직접 실행하면 정상적으로 동작하고 있습니다.
코드가 복잡하지 않기 때문에 특별한 문제는 없어 보이는데 권한 관련 다른 문제가 있을 수 도 있습니다.
오타나 기타 설정 등을 확인해 주시기 바랍니다.
0
추가로, @PostAuthorize
관련해서 어떻게 사용하는지는 이해가 가는데 어떤 상황에 적용하면 좋을 지 use case 가 잘 떠오르지 않네요.
보통은 @PreAuthorize
로 설정할 것 같은데, 혹시 @PostAuthorize
를 꼭 사용해야만 하는 use case 가 있을까요?
@PostAuthorize 는 예를 들어서 요청 후 어떤 결과를 받아와야 하는데 게시물을 올린 본인것만 가져와야 할 경우 게시물에 저장된 아이디와 인증받은 아이디를 서로 비교해서 일치하면 가져오고 일치하지 않으면 가져오지 못하는 경우를 들 수 있습니다
즉 결과 데이터를 필터링 하고자 할 때 사용합니다.
전혀 감을 못잡았었는데, 이렇게 확인해주셔서 감사합니다! :)