작성
·
217
0
안녕하세요 영한님 강의를 토대로 개인프로젝트를 진행하다가 생긴 의문점입니다
스프링 시큐리티의 @Preauthorize를 공부하다가 생긴 의문인데,
만일 여러 컨트롤러의 메서드에서 단순히 User의 ROLE_XXX 뿐만이 아니라, 현재 유저에게 이 리소스를 사용할 자격이 있는지?
를 검사하는 공통된 로직이 필요하다면 (리소스 단순 CRUD 뿐만이 아니라 더 세부적인 로직들이 있다면), 여기에 aop를 적용하는 의의가 있을까요?
만일 의의가 있다면, 권한이 있는지를 알려면 DB에 다녀와야 하는데
AOP에서 데이터소스에 접근하는별로 좋은 방법이 아니라고 들었습니다.
간단한 예시긴 하지만, 대충 이런 로직을 구현하려고 합니다
@CheckOwner어노테이션이 붙어있고, postId를 인자로 받은 경우에선
post.Member.id가 현재 세션의 memberId와 같은 경우에만 이후 로직이 진행되게 하려는 의도입니다.
@Around("@annotation(CheckOwner) && args(postId,..)")
public Object checkPostOwner(ProceedingJoinPoint joinPoint, Long postId) throws Throwable {
log.info("test");
//DefaultTransactionDefinition def = new DefaultTransactionDefinition();
//TransactionStatus status = tr.getTransaction(def)
MockPrincipal principal = (MockPrincipal)SecurityContextHolder.getContext()
.getAuthentication()
.getPrincipal();
Post post = postRepository.findById(postId).orElseThrow(NoPostException::new);
if (!post.getMember().getId().equals(principal.getId())) {
throw new AccessDeniedException("권한이 없다고");
}
Object result = joinPoint.proceed();
log.info("test");
//tr.commit(status);
return result;
}
답변 1
1
안녕하세요. 지헌님
AOP를 사용하더라도 AOP가 직접 데이터베이스 관련 코드를 사용하는게 아니라, 리포지토리 같은 코드를 통해서 접근한다면 문제 없다 생각합니다.
감사합니다.
우왕 너무 감사합니다!!!