읽은 책 정리/코드로 배우는 스프링 웹 프로젝트

[Spring] 34 스프링 시큐리티를 JSP에서 사용하기

포포015 2021. 3. 1. 22:44

JDBC와 약간의 쿼리를 이용하는것만으로도 DB를 이용해 시큐리티를 사용할수 있음에도 불구하고,

굳이 CustomUserDetailsService와 같이 별도의 인증/권한 체크를 하느 가장 큰이유는

JSP 에서 단순히 사용자의 아이디(시큐리티에서는 username)정도가 아닌,

사용자의 이름이나 이메일과 같은 추가적인 정보를 이용하기 위해서이다!!!!

 

pom.xml 에서 시큐리티를 이용할떄 사용하는 태그라이브러리를 추가해둿으므로

JSP 에서 이를 활용하는 방법에대해 알아본다.

 

 

JSP에서 로그인한 사용자 정보 보여주기

/sample/admin 과 같은 경로는 로그인한 사용자만 접근할수 있고,

만일 권한이 적당하지않으면 볼수없는 페이지므로 , 로그인한 사용자가 접근 했을떄에는

해당 사용자의 여러정보를 보여줄 필요가있다.

 

스프링 시큐리티와 관련된 정보를 출력하거나 사용하려면

JSP 상단에 시큐리 관련 태그 라이브러리의 사용을 선언하고,

<sec:authentication>태그와 principal 이라는 이름의 속성을 사용한다

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ 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>
<h2>admin</h2>
 
<p>principal : <sec:authentication property="principal"/></p>
<p>MemberVO : <sec:authentication property="principal.member"/></p>
<p>사용자이름: <sec:authentication property="principal.member.userName"/></p>
<p>사용자 아이디: <sec:authentication property="principal.username"/></p> 
<p> 사용자 권한 리스트: <sec:authentication property="principal.member.authList"/></p>
 
<a href="/customLogout">로그아웃</a>
</body>
</html>
cs

<sec:authentication property="principal"/>을 이용했을떄 의미하는것은

UserDetailService 에서 반환된 객체이다.

(즉 CustomUserDetailService를 이용했다면 loadUserByUsername()에서 반환된 CustomUser 객체가 된다.

principal이 CustomUser를 의미하므로 'principal.member'는 CustomUser 객체의 getMember()를 호출한다

 

표현식을 이용하는 동적 화면구성

경우에 따라서느 특정한 페이지에서 로그인한 사용자의 경우 특정한 내용을 보여주고,

그렇지 않은경우 다른내용을 보여주는경우가 있다. 이떄 유용한것이 시큐리티의 표현식이다.

스프링 시큐리티의 표현식은 security-context.xml에서도 사용된다.

주로 사용되는표현식은 아래와 같다

표현식 설명
hasRole([role])
hasAuthority([authority])
해당권한이 있으면 true
hasAnyRole([role,role2])
hasAnyAuthority([authority])
여러 권한들중에 하나라도 해당하는 권한이 있으면 true
principal 현재 사용자 정보를 의미
permitAll 모든 사용자에게 허용
denyAll 모든 사용자 에게 거부
isAnonymous() 익명의 사용자의 경우(로그인을 하지않은경우도 해당)
isAuthenticated() 인증된 사용자라면 true
isFullyAuthenticated() Remeber-me 로 인증된것이 아닌 인증된 사용자의경우 true
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ 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>
<h2>all</h2>
 
<sec:authorize access="isAnonymous()">
    <a href="/customLogin">로그인</a>
</sec:authorize>
 
<sec:authorize access="isAuthenticated()">
    <a href="/customLogout">로그아웃</a>
</sec:authorize>
 
</body>
</html>
cs

위 jsp는 로그인한 경우와 그렇지 않은경우에 따라서 다른결과를 만들어낸다.