inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

호돌맨의 요절복통 개발쇼 (SpringBoot, Vue.JS, AWS)

시큐리티 Permission Evaluator

Permission targetId null

452

홍성민

작성한 질문수 1

1

vue.js aws spring-boot jpa spring-security

답변 2

0

Hail

hasPermission에서 targetId 가 null로 받는 현상 관련,

3.2부터 달라진 PathVariable 에 대한 처리 때문인 것 같은데요,

 

hasPermission 을 보면 targetId 는 Serializable (static 이거나 long ) 을 요구합니다.

문제는 PathVariable 이 3.2 부터 key-value 방식을 이용하는데 이게 결국 hash 사용한다는 말이라면 동적 파라미터로 되는 것 같았어요, static 은 아닐 거라 생각드네요..

따라서 #someId 로 hasPermission에 파라미터를 전달할 때, Long type이나 static 이 아닌 key (hash) 값이 넘어갈 수도 있지 않나 생각이 듭니다.

 

우회방안은 여러가지가 있을 것 같은데

저는 authentication 에서 principal 을 받아올 수 있는데 여기에 pk 넣어두고 사용했습니다.

 

0

Hail

  쉽게 말해서 #someId  를 Serializable 로 캐스팅하지 못하는 게 이슈 인 것같아 보이긴 합니다..

0

호돌맨

님! 제가 잠깐 밖이라 그런데

저 expression호출하는 컨트롤러 코드도 올려주시면 감사하겠습니다.

0

홍성민

@Slf4j
@RestController
@RequiredArgsConstructor
public class PostController {

    private final PostService postService;

    @PreAuthorize("hasRole('ROLE_ADMIN')")
    @PostMapping("/posts")
    public Long post(@AuthenticationPrincipal UserPrincipal userPrincipal, @RequestBody @Valid PostCreate postCreate) {
        return postService.write(userPrincipal.getUserId(), postCreate);
    }

    @GetMapping("/posts/{postId}")
    public Post get(@PathVariable("postId") Long postId) {
        return postService.findById(postId);
    }

    @GetMapping("/posts")
    public List<Post> posts(@ModelAttribute("postSearch") PostSearch postSearch) {
        return postService.findAll(postSearch);
    }

    @PreAuthorize("hasRole('ROLE_ADMIN') && hasPermission(#postId, 'POST', 'DELETE')")
    @PatchMapping("/posts/{postId}")
    public void edit(@PathVariable("postId") Long postId, @RequestBody @Valid PostEdit postEdit) {
        postService.edit(postId, postEdit);
    }

    @PreAuthorize("hasRole('ROLE_ADMIN') && hasPermission(#postId, 'POST', 'DELETE')")
    @DeleteMapping("/posts/{postId}")
    public void delete(@PathVariable("postId") Long postId) {
        postService.delete(postId);
    }
}

PostController 전체입니당

 저는 MyBatis를 사용해보아서 postService 메서드 이름은 다릅니다!
수정 메서드에 Permission으로 DELETE를 넘겻는데 오타입니다!

0

홍성민

스프링부트 3.2부터는 @Pathvarible @RequestParam 등 name값을 명시하게 바뀌고 권장하는 방식이라 자바 컴파일시 -parameter 옵션을 안주고 저렇게 하였는데,

 

부트 버전을 2.x로 낮추거나, 자바 컴파일 -parameter옵션을 주고
@PreAuthorize(value = "hasRole('ROLE_ADMIN') && hasPermission(#postId, 'POST', 'DELETE')")

@DeleteMapping("/posts/{postId}")

public void delete(@PathVariable Long postId) {

postService.delete(postId);

}
위와같이 name값을 제거해주니 targetId에 잘 넘어오네요.

 

부트3.2 부터 -parameter 옵션을 안주었을 때 매핑이 안되는 이유는 제가 더 찾아보겠습니다.!

감사합니다! 남은 강의도 완강하겠습니다!

Deprecated 관련 사항들

0

100

2

깃헙 collaboator 초대 관련

0

87

1

강의 듣다가 도커 이미지 생성시 각각도 가능하나 그렇게 사용하는데가 많은지 모르겠다라는 말을 듣고 남김니다

0

157

2

logout 후에 login 페이지 이동은 어디서 시켜주는건가요?

0

229

1

다중 데이터를 삭제 할 때

0

270

2

querydsl Q class 이슈

0

414

2

Windows WSL Vue 설정

2

246

1

Dip, @transactional

0

187

1

[vite] http proxy error: /auth/login

0

1042

2

로그인 하고 나서 GET요청으로 메인페이지 요청

0

234

2

GitHub Collaborator 초대 관련

0

256

2

Window에서 Vue.js 설정

0

321

2

(솔루션 수정)'tsyringe' Error: TypeInfo not known for "클래스명"

0

713

2

collaboator로 초대받을 수 있을까요??

0

283

2

SecurityMockContext 로부터 유저 정보를 가져오기

0

261

1

given 부분이 길어질 때 어떻게 처리하면 좋을까요?

0

317

1

섹션9 프론트의 코드를 보고싶습니다,,,

0

423

1

Spring Security - defaultSuccessUrl 질문

0

625

1

강의 화면이 나오지 않습니다. 음성과 자막만 나와요

0

302

1

JPAQueryFactory(em)의 객체 생성자 오류에 대해서 질문이 있습니다ㅜㅜ

0

689

2

ExceptionHandler가 AccessDeniedHandler(Http403Handler)를 먹어버리는 현상

0

1179

2

섹션10 언제 나오나요?

0

484

1

CommentService에서 Repository를 호출하지 않는데도

0

342

1

Editor....를 활용한 패턴에 질문있습니다.

0

494

1