스프링 시큐리티 접근 권한에 따라 보이는 요소 설정하기

스프링 시큐리티를 적용하여 웹어플리케이션 프로젝트를 만들고 있다면 JSP 페이지에서 접근권한에 따라 보이는 요소를 지정할 수 있다. 관리자 페이지로 가는 링크는 관리자에게만 보여지도록 할 수 있다는 이야기다.

이를 적용하면 권한이 없는 사용자가 권한이 없는 페이지에 접근하는 경우를 대폭 줄일 수 있다. 어짜피 접근 권한이 없는 링크를 사용자에게 보여줄 필요는 없다. URL에 직접 관리자 페이지 접속 주소를 친다면 권한이 없다는 403 페이지를 보게 되겠지만, 일반적인 사용자가 관리자 페이지 접속 주소를 모르는 상태에서 그런 시도를 할 이유는 거의 없다.

본 포스트는 스프링 시큐리티가 적용되어 있다는 가정하에 진행한다. 먼저 스프링 시큐리티 설정을 담은 security-context.xml은 다음과 같다. Gist에서 보기

설정파일에 대해서 설명하자면 포스트 하나로는 부족하니 넘어가고 권한에 따라 보이는 요소를 다르게 할 JSP 파일 상단에 스프링 시큐리티 태그 라이브러리를 선언한다.

선언이 되었으면 <sec:authorize> 태그를 사용하여 권한에 따라 보여지고 싶은 부분을 감싸주면 된다. 그런데 여기서 문제가 발생했다. 내가 참고한 페이지에 따르면 다음과 같이 하라고 나와 있다.

그런데 아래와 같은 오류를 뿜어내며 동작하지 않는다.

설정에 use-expressions="true"을 설정하지 않아서 hasRole() expression을 사용할 수 없어서 발생하는 에러라고 생각되어 hasRole('ROLE_ADMIN') 부분을 그냥 ROLE_ADMIN으로 변경해봤지만 같은 에러 메세지가 발생했다.

해결방법

결론부터 말하자면 <sec:authorize access="블라블라"> 로는 해결하지 못했다. access 대신 url을 사용하여 해결했는데, 해당 url에 접근 할 수 있는 권한을 가진 계정에 한해서 보여진다. 이 방법을 사용하여 관리자 페이지 링크를 관리자 권한을 가진 계정만 볼 수 있도록 설정하였다. JSP 페이지에 삽입된 코드는 아래와 같다.

참고
  • http://stackoverflow.com/questions/9048995/get-spring-security-principal-in-jsp-el-expression
  • http://docs.spring.io/spring-security/site/docs/3.0.x/reference/taglibs.html
  • http://www.linkedin.com/groups/sec-authorize-doesnt-work-in-46964.S.5860745992025956356
  • http://www.baeldung.com/spring-security-expressions-basic
  • http://cluster1.cafe.daum.net/c21/bbs_search_read?grpid=1DpW4&fldid=Pgo7&datanum=1
  • http://www.mkyong.com/spring-security/spring-security-access-control-example/

About dezang

애플제품과 구글서비스를 좋아합니다. 블로그에서는 반말사용하며 시크한 척하지만 실제로는 예의바르고 상냥합니다^^. 언젠가는 세상을 바꾸는 개발자가 되고자 합니다. 언젠가는...

댓글 남기기