AOP

고은아·2023년 7월 31일
0

TIL

목록 보기
38/49

AOP를 활용하여 예외 처리 중이다.

@Around("updatePost() || deletePost()")
public Object executePostRoleCheck(ProceedingJoinPoint joinPoint) throws Throwable {
    Post post = (Post) joinPoint.getArgs()[0];

    Authentication auth = SecurityContextHolder.getContext().getAuthentication();
    if (auth == null || !(auth.getPrincipal() instanceof UserDetailsImpl)) {
        throw new UnauthorizedAccessException("[AOP] 작성자만 게시글을 수정/삭제 할 수 있습니다.");
    }

    UserDetailsImpl userDetails = (UserDetailsImpl) auth.getPrincipal();
    User loginUser = userDetails.getUser();

    if (!(loginUser.getRole().equals(UserRoleEnum.ADMIN) || post.getUser().equals(loginUser))) {
        throw new UnauthorizedAccessException("[AOP] 작성자만 게시글을 수정/삭제 할 수 있습니다.");
    }

    return joinPoint.proceed();
}
  1. @Around("updatePost() || deletePost()"): 이 코드는 AOP에서 어드바이스를 적용할 메서드의 실행 조건을 지정. updatePost()와 deletePost()라는 이름의 메서드가 실행될 때 이 AOP 어드바이스가 동작.

  2. public Object executePostRoleCheck(ProceedingJoinPoint joinPoint) throws Throwable: executePostRoleCheck 메서드는 AOP 어드바이스에서 실행되는 메서드로, ProceedingJoinPoint 객체를 매개변수로 받음. 이 객체를 사용하여 원본 메서드의 실행을 직접 조작 가능.

  3. Post post = (Post) joinPoint.getArgs()[0];: joinPoint.getArgs()를 통해 원본 메서드의 인자들을 가져옴. 여기서는 updatePost() 또는 deletePost() 메서드의 첫 번째 인자로 전달되는 Post 객체를 가져옴.

  4. Authentication auth = SecurityContextHolder.getContext().getAuthentication();: SecurityContextHolder를 사용하여 현재 사용자의 인증 정보를 가져옴. Spring Security에서 인증 정보는 Authentication 객체로 관리.

  5. if (auth == null || !(auth.getPrincipal() instanceof UserDetailsImpl)) { ... }: 인증 정보가 없거나 인증 주체(Principal)가 UserDetailsImpl 클래스의 인스턴스가 아니면, 즉 사용자가 인증되지 않았거나 인증 주체가 예상하지 않은 형식이면 권한 없음 예외 발생.

  6. UserDetailsImpl userDetails = (UserDetailsImpl) auth.getPrincipal();: 인증 주체에서 UserDetailsImpl 객체를 가져옴. UserDetailsImpl은 사용자의 상세 정보를 담고 있는 클래스로, 사용자의 권한(UserRoleEnum), 인증 정보 등 포함.

  7. User loginUser = userDetails.getUser();: UserDetailsImpl 객체에서 실제 사용자 정보인 User 객체 추출. User 객체에는 사용자의 식별자, 이름, 권한 등의 정보가 포함.

  8. if (!(loginUser.getRole().equals(UserRoleEnum.ADMIN) || post.getUser().equals(loginUser))) { ... }: 로그인한 사용자의 권한이 ADMIN인 경우 또는 게시글의 작성자가 로그인한 사용자인 경우에는 권한 체크를 통과. 그렇지 않은 경우, 즉 일반 사용자가 다른 사용자의 게시글을 수정 또는 삭제하려고 할 때는 권한 없음 예외 발생.

  9. return joinPoint.proceed();: 권한 체크를 통과한 경우, 원본 메서드를 실행시키고 그 결과 반환. 이로 인해 updatePost() 또는 deletePost() 메서드가 정상적으로 실행될 수 있게 됨.

1개의 댓글

comment-user-thumbnail
2023년 7월 31일

좋은 글 감사합니다.

답글 달기

관련 채용 정보