woo8386
154
2020-10-24 16:26:44
3
120

스프링시큐리티, 타임리프 질문


public class CustomUser extends User {
    
    private int age;
  ...

User를 상속 받아서 필요한 필드를 추가 했습니다.

그리고 타임리프에서 ${#authentication.principal.age} 이런식으로 꺼내서 사용하려고 했는데요.


@WebMvcTest를 작성하는데 @WithMockUser를 사용해서 하면 principal에 age라는 필드가 없어서 에러가 납니다.

Exception evaluating SpringEL expression: "#authentication.principal.age"


방법을 찾다가 @WithUserDetails를 사용하라는데 이경우는 @SpringBootTest 통합테스트를 하거나

userDetailsService 빈을 등록해야하는데 연관된 빈들도 다 등록해야 하니까 단위테스트가 아닌거 같아서요.


JSP는 그냥 빈값으로 채워줬던걸로 기억하는데  타임리프에서 존재하지 않는 필드를 꺼내려고 할때 에러 안나게 공백으로 바꿀수 있는 문법이 있을까요?


0
  • 답변 3

  • John Suhr
    3k
    2020-10-24 16:42:32 작성 2020-10-24 17:03:52 수정됨
    @Service
    public class ThymeleafHelper {
        @Nullable
        public CustomUser getCurrentUser() {
            return Optional.ofNullable(SecurityContextHolder.getContext())
                .map(SecurityContext::getAuthentication)
                .map(Authentication::getPrincipal)
                .map(CustomUser.class::cast)
                .orElse(null);
        }
    }
    <span
        sec:authorize="isAuthenticated()"
        th:text="${@thymeleafHelper.currentUser.age}"
    ></span>

    해당 오류는 Authentication#principal의 반환 타입이 Object라서 CustomUser의 age 필드를 알 수 없어 발생하는 것 같습니다?

  • woo8386
    154
    2020-10-24 16:46:38

    직접 실행시켜서 로그인 하거나 통합테스트로 @WithUserDetails를 사용하면 테스트가 통과합니다.

    principal에 해당 필드가 있는지 확인해야 하는데

    타임리프 if문을 사용해도 해당 필드 자체가 없으니 에러가 나버리네요.

  • woo8386
    154
    2020-10-24 17:17:10 작성 2020-10-24 18:33:08 수정됨
  • 로그인을 하시면 답변 을 등록할 수 있습니다.