principal
DB와 연동된 security 로그인이 활성화되었다면 이제 jsp 파일 내부에
sec 태그를 활용해볼 수 있습니다.
springframework의 security tag 경로를 설정하고 sec라는 이름으로 임폴트했습니다.
이제 sec를 활용한 principal을 불러올 수 있어요.
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib uri="http://www.springframework.org/security/tags" prefix="sec" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>admin 로그인 성공</h1>
<h2>다양한 페이지 정보</h2>
<!-- getter를 걸어놓아서 pricipal을 가져올 수 있어요 -->
<p>principal : <sec:authentication property="principal"/></p><hr/>
<p>MemberVO : <sec:authentication property="principal.member"/></p><hr/>
<p>principal로 꺼낸 ID : <sec:authentication property="principal.Username"/></p><hr/>
<p>사용자의 이름 : <sec:authentication property="principal.member.userName"/></p><hr/>
<p>사용자의 아이디 : <sec:authentication property="principal.member.userId"/></p><hr/>
<p>사용자의 권한 목록 : <sec:authentication property="principal.member.authList"/></p><hr/>
<a href="/customLogout">로그아웃</a>
</body>
</html>
저희는 MemberVO를 가져오는 service에 @Getter를 걸어두었기 때문에
principal의 파라미터들을 불러올 수 있어요.
로그인 성공 페이지에 위와 같이 작성했더니
MemberMapper가 username에 따라 읽어온
pricipal의 정보를 모두 확인해볼 수 있었어요.
principal 의 성능이 session을 쓰는 것 같은데 session보다 훨씬 좋습니다.
시큐리티 표현식
principal 은 물론이고
sec 에는 좋은 표현식들이 많이 있습니다.
hasRole은 권한을 검사할 때
hasAnyRole은 원하는 권한 중 뭐든 통과시키고 싶을 떄
principal은 현재 접속 사용자의 정보
permitAll 권한이 없어도 모두 허용
denyAll은 테스트 코드 등에 접속하는 것을 막고 싶을 때
등등 위와 같이 사용할 수 있습니다.
아래에 한 번 적용해보겠습니다.
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib uri="http://www.springframework.org/security/tags" prefix="sec" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>all 로그인 성공</h1>
<sec:authorize access="isAnonymous()">
<!-- 로그인 안 한 익명일 경우 -->
<a href="/customLogin">로그인</a>
</sec:authorize>
<sec:authorize access="isAuthenticated()">
<!-- 로그인(인증된) 사용자인 경우 -->
<a href="/customLogout">로그아웃</a>
</sec:authorize>
</body>
</html>
모든 접속에 연결되도록 설정해둔 all.jsp를 수정했습니다.
sec 태그를 임폴트한 뒤에 access="isAnonymous()"를 건
sec태그를 생성하면 if문을 걸어서 session 체크를 하던 것과
동일한 효과를 볼 수 있습니다.
user29로 로그인된 상태로 /secu/all 에 접속했을 때
위와 같이 로그아웃 a태그가 표현되었습니다.
해당 페이지를 확인해보니 isAnonymous태그는 아예
보일 수가 없습니다. 활용할 여지가 정말 많은 태그인 것 같아요.