> Hello World !!!

     

@syaku

Spring security @PreAuthorize @PostAuthorize 어노테이션 활용 #1

written by Seok Kyun. Choi. 최석균


Spring security @PreAuthorize @PostAuthorize 어노테이션 활용 #1

개발환경

Mac OS X 10.9.4
JAVA 1.6
Apache Tomcat 7.x
Spring 3.2.12
Spring security 3.2.5
Spring Tool Suite 3.5.1
Maven 2.5.1

@PreAuthorize @PostAuthorize 어노테이션은 인자값과 결과값을 이용해서 인증을 검사하는 역활을 한다.
게시판에 작성된 글을 수정하려면 본인 글인지 먼저 확인해야 한다. 그럴때 사용하면 유용한 어노테이션이다.

보통 게시판 정보를 불러올때 게시물 번호를 이용하기 때문에 인자로 인증을 검사할 수 없다. 그래서 결과 값을 이용하여 검사해야 하는 데 이럴때 @PostAuthorize 사용하면 된다.

설명을 진행하기 전에 필히 확인해야 하는 부분을 설명하겠다. 설명대로 되어 있지 않다면 인증 어노테이션이 적용되지 않으며, 아무런 오류나 문제사항이 발생하지 않을 수 있으니 참고한다.

  • 시큐리티 SpringEL 설정을 활성화한다. security-context.xml 설정 파일을 확인하면 된다.
    <http use-expressions="true" ...
    
  • pre-post-annotations 설정을 활성화한다. component-scan 을 설정한 파일을 확인하거나 추가한다.
    <security:global-method-security pre-post-annotations="enabled" />
    
  • 컨트롤러 스캔과 서비스 스캔을 따로하는 경우가 있다. 이럴때 두 설정파일에 모두 pre-post-annotations 설정을 활성화해야 한다.
public interface PostService {

    @PostAuthorize("isAuthenticated() and returnObject.user_id == principal.username")
    Post getUserPost(String id);

}

isAuthenticated() 는 인증된 사용자를 의미한다.
returnObject 는 결과 객체의 값을 사용할 수 있게 한다.

그래서 인증된 회원이고 회원 아이디와 등록자 아이디가 일치해야만 데이터를 얻을 수 있다. 그렇지 않을 경우 AccessDeniedException 호출된다.

@Controller
public class PostController {

    @RequestMapping(value = "/post/{id}", method = RequestMethod.GET, produces = "application/json")
    public @ResponseBody Post getPost(@PathVariable("id") String id) {

        Post post;
        try {
            post = postService.getUserPost(id);
        } catch(RuntimeException e) {
            logger.info(">>>>>>>>>>>>>" + e.toString());
            post = postService.getPost(id);
        }

        return post;
    }



}

위 소스처럼 컨트롤러에서 서비스를 호출하여 사용하면 된다.

만약 익명게시판인 경우 본인 글이 아닐때 익명처리하기 위해 예외를 이용하여 두가지 메서드를 호출할 수 있게 구현하였다.
권한이 있는 경우 모든 데이터가 노출되고 예외가 발생할 경우 작성자 정보는 제거하는 서비스를 호출하면 된다.

컨트롤러에서 충분히 할 수 있는 로직이지만 각자 역활에 충실하기 위해 컨트롤러에 데이터 처리 로직을 구현하지 않은 것이다.

@PreAuthorize 는 인자값을 이용해 검사하는 어노테이션이다. 위 설명과 크게 다를게 없어 생략한다.


참고 사이트 : http://docs.spring.io/spring-security/site/docs/3.0.x/reference/el-access.html

posted syaku blog

Syaku Blog by Seok Kyun. Choi. 최석균.

http://syaku.tistory.com