2016년 9월 28일 수요일

thymeleaf 에서 spring security login 여부를 변수로 사용하기

spring security 정보를 thymeleaf 에서 사용하는 기본적인 방법은 다음과 같다.

thymeleaf-extras-springsecurity4 를 사용하고 다음과 같이 호출한다.
<div sec:authorize="hasRole('ROLE_ADMIN')">
    This content is only shown to administrators.
</div>
<div sec:authorize="hasRole('ROLE_USER')">
    This content is only shown to users.
</div>

이와 같이 사용하면 영역별로 처리하기 편하지만 영역을 나누기 싫은 경우가 있다.

이럴 때엔 thymeleaf의 변수로 사용하는 것이 편하다.

다음과 같이 사용이 가능하다.

<div th:with="isLogin = ${#authorization.expression('isAuthenticated()')}">
[[${isLogin}]]
    </div>

일반적으로 위와 같이 사용하면 아무 문제가 없다.
하지만 security가 적용되지 않은 요청 범위의 페이지(예를 들면 /error/...와 같은 에러 페이지)를 호출할 경우
Caused by: java.lang.IllegalArgumentException: Authentication object cannot be null
에러가 발생한다.

spring security를 통해 authorization이 생성되지 않은 상태에서 expression을 호출하기 때문인데 이를 방지하기 위해 아래처럼 선언하는 것이 좋다.

<div th:with="isLogin = ${#authorization.getAuthentication() != null and #authorization.expression('isAuthenticated()')}">
[[${isLogin}]]
</div>

댓글 없음:

댓글 쓰기