어플리케이션을 구현하다보면 jsp에서 분기처리를 해서 권한에 따라서 다른 상황이 발생합니다.
이런 상황일때 스프링 시큐리티를 사용하여 권한관리를 하고 있다면 간단하게 구현을 할 수 있습니다.
ex)
- 관리자 권한이 있다면 관리자 페이지 링크를 보여주는 로직
- 로그인에 성공해서 특정 권한을 획득한 사용자에게는 로그인 버튼 대신 로그아웃 버튼을 보여주는 로직
권한 정보는 세션에 저장돼 있기 때문에 가져다가 사용해도 무방하지만, Security 태그를 사용하면 좀 더 가시성 좋게 코드를 구성할 수 있습니다.
1. pom.xml에 dependency 추가
<!-- 시큐리티 태그 라이브러리 -->
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-taglibs</artifactId>
</dependency>
2. JSP 파일에 태그 라이브러리 추가
현재 프로젝트에서는 헤더 JSP 파일을 만들어 모든 JSP파일에 삽입하여 로그인에 성공한 사용자의 세션에 접근할 것 입니다.
isAuthenticated() 함수는 로그인 인증을 받았는지를 확인합니다. ( <-> isAnonymous() )
<!-- header.jsp -->
...
<%@ taglib prefix="sec" uri="http://www.springframework.org/security/tags"%>
<!-- 세션정보 접근 -->
<!-- 이제 어디에서든지 principal.~ 로 접근가능 -->
<sec:authorize access="isAuthenticated()">
<sec:authentication property="principal" var="principal"/>
<!-- principal property가 UserDetails임-->
</sec:authorize>
...
그리고 다른 jsp 파일들에선 이런식으로 헤더파일의 경로를 include 해주시면 됩니다.
<%@ include file="../layout/header.jsp"%>
property를 principal로 주고 변수에 담아주면 자바 코드에서 getProperty()를 실행한것과 동일합니다.
즉 사용자 정보를 담고 있는 UserDetails 객체가 반환됩니다.
변수명을 principal로 설정했기 때문에
저희는 모든 jsp 파일에서 principal 변수로 세션 정보에 접근할 수 있습니다.
3. 세션 정보 사용
...
<div class="item__title">이름</div>
<div class="item__input">
<input type="text" name="name" placeholder="이름"
value="${principal.user.name}" required="required"/>
</div>
</div>
...
이전 글에서 저희는 UserDetails를 구현한 PrincipalDetails에 User 객체를 user 변수에 넣었기 때문에
${principal.user.name} 으로 JSP파일에서 해당 유저의 이름에 접근할 수 있습니다.
'Spring' 카테고리의 다른 글
Spring Data JPA - Native SQL Query 작성하기 (0) | 2021.08.20 |
---|---|
Ajax 사용해 put 요청 / Validation Check / 영속화, 영속성 컨텍스트 (0) | 2021.08.19 |
스프링부트 로그인 구현하기 (0) | 2021.08.14 |
스프링부트 회원가입 구현하기 2 (0) | 2021.08.12 |
스프링부트 회원가입 구현하기 (0) | 2021.08.09 |