• 카테고리

    질문 & 답변
  • 세부 분야

    백엔드

  • 해결 여부

    미해결

@PreAuthorize에 사용하는 SpEL 문법에 대해 질문드립니다.

21.06.24 17:59 작성 조회수 466

0

선생님 안녕하세요 

@PreAuthorize 에서 사용한 SpEL 문법 사용 원리에 대해 제가 정확하게 이해하고 있는지 확신이 안서서 질문드립니다.

1. 먼저 해당 SpEL 표현에서 account, principal 두가지 변수를 참조하는데 account 앞에만 # 을 붙이는 이유는

aop/method.html 파일 내에서 th:href="@{/preAuthorize(username='user')}" 를 통해 생성된 AccountDto 객체를 참조하기 위해서 인가요?

그렇다면 principal 에 #이 안붙는 이유는 클라이언트가 인증 정보를 가지고 있는 경우 스프링 컨트롤러에서 매개변수를 통해 principal 객체를 가져오도록 지원하는 건가요??

2. 현재 principal 객체의 클래스는 UsernamePasswordAuthenticationToken 인데 저희 강의에서 사용하는 Account 객체를 담는 토큰이라고 생각하고 있었습니다. 

그렇다면 Account 객체의 username 값을 참조하려면

아래 사진의 Evaluate Expression을 통해 확인한 것 처럼 principal.principal.username 으로 표현해야 한다고 생각했습니다. 그래서 SpEL 표현을 principal.principal.username으로 변경하여 테스트 해보았는데 SpEL 문법 예외가 발생하는것을 확인했습니다.

어째서 오직 principal.username로만 username 값에 참조를 할 수 있는지 궁금합니다.. 

제가 SpEL 표현법을 완벽히 숙지하지 못해서 이해가 안가는 것 같은데요.. 스프링 시큐리티와 크게 관련된 내용이 아니라서 질문을 드려도 될지는 모르겠지만 SpEL 관련 자료를 열심히 찾아봐도 마땅한 이유를 찾지 못해서 질문드립니다. 좋은 강의 감사합니다.

답변 2

·

답변을 작성해보세요.

0

foobar님의 프로필

foobar

질문자

2021.07.02

스프링 시큐리티의 principal 에 대한 개념이 정확하게 잡힌것 같습니다.

정성스러운 답변 감사합니다!!

0

먼저 답변이 늦어 죄송합니다.

1번 질문 답변입니다.

말씀하신대로 객체를 참조하기 위해서는 #을 붙여야 합니다. 

즉 메서드의 객체 파라미터에 접근할 수 있는 접두문자라고 보시면 됩니다.

가령 메소드 파라미터로 User 객체가 넘어온다면 #user 와 같이 사용할 수 있는 개념입니다. 

그리고 principal 은 스프링 시큐리티에서 사용자인증 정보에 접근할 수 있도록 표현식으로 제공하는 문법이라 보시면 됩니다.

isAuthenticated() 와 같은 것도 같은 맥락입니다.

2번 질문 답변입니다.

principal 은 Object 타입으로 인증정보와 관련된 어떤 객체를 할당해도 됩니다.

다만 인정정보가 저장된 pincipal 의 속성을 표현식으로 나타낼 경우에는 principal 에는 최종 인정정보가 저장되어 있다고 가정하고 있습니다.

그렇기 때문에 principal 에 여러 인증객체를 저장한다 해서 참조를 여러단계에 걸쳐 할 수 없습니다.

단순하게 생각해서 principal 은 인증객체 그 자체라고 생각하시면 됩니다.