레이블이 spring security인 게시물을 표시합니다. 모든 게시물 표시
레이블이 spring security인 게시물을 표시합니다. 모든 게시물 표시

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>