본문 바로가기
Spring공부/4-스프링시큐리티

스프링 시큐리티와 JSP

by 으노으뇨 2021. 10. 19.
728x90
반응형
SMALL

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

/sampl/admin 과 같은 경로는 로그인한 사용자만이 접근할 수 있고, 만일 권한이 적당하지 않으면 볼수 없는

페이지이므로 로그인한 사용자가 접근 했을 때에는 해당 사용자의 여러 정보를 보여줄 필요가 있다.

스프링 시큐리티와 관련된 정보를 출력하거나 사용하려면 JSP상단에 스프링 시큐리티 관련 태그 라이브러리 

사용을 선언하고, <sec:authentication>태그와 principal이 라는 이름의 속성을 사용한다.

지금현재 있는 JSP파일에 해당 태그를 추가한다.

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>    
<%@ taglib uri="http://www.springframework.org/security/tags" prefix="sec" %>

그리고 해당 사용자의 이름과 아이디, 권한들을 나타날 수 있도록 하기위해 각각의 태그들을 넣어주어

불러온 정보를 화면단에 나타나게 해줄 수 있다.

<body>
<h1>/sample/admin page</h1>


<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">Logout</a>


</body>
</html>

해당 Body태그 부분은 이렇다.

<sec:authentication property="principal"/>를 이용했을 떄 의미하는 것은 UserDetilsService에서 반환된

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

이 사실을 이해하면, 'principal'이 CustomUser를 의미하므로, 'principal.member'는 CustomUser객체의 getMember()를

호출한다는 것을 알 수 있다.

브라우저에서 로그인을 한 이후에 admin.jsp파일은 다음과 같은 정보들이 출력된다.


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

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

다른 내용을 보여주는 경우가 있다. 

이때 유용한 것이 스프링 시큐리티의 표현식이다. 

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

스프링 시큐리티에서 주로 사용되는 표현식은 아래와 같다.

표현식 설  명
hasRole([role])
hasAuthority([authority])
해당 권한이 있으면 true
hasAnyRole([role.role2])
hasAnyAuthority([authority])
여러 권한들 중에서 하나라도 해당하는 권한이 있으면 true
principal 현재 사용자 정보를 의미
permitAll 모든 사용자에게 허용
denyAll 모든 사용자에게 거부
isAnonymous() 익명의 사용자의 경우(로그인을 하지 않은 경우도 해당)
isAuthenticated() 인증된 사용자면 true
isFullyAuthenticated() Remember-me로 인증된 것이 아닌 인증된 사용자인 경우 true

이 표현식들 중 isAnonymous()를 이용해서 로그인을 하지않았다면 , 했다면 그것을 참 유무를 통해 화면을 바뀌는 것을 구현해보았다.

그 중 모든 권한(권한이없는사람들조차도)인 사람들이 보이는 All.jsp파일화면을 볼 수 있도록 구현해보았다.

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>    
<%@ taglib uri="http://www.springframework.org/security/tags" prefix="sec" %>    
<!-- 중략-->
<sec:authorize access="isAnonymous()">
  <a href="/customLogin">로그인</a>
</sec:authorize>
<sec:authorize access="isAuthenticated()">
  <a href="/customLogout">로그아웃</a>
</sec:authorize>

왼쪽은 비로그인 상태에서 /sample/all의 화면이고 , 오른쪽은 로그인된 상태의 화면이다.

if문으로 로그인상태를 받아서 사용한게 아니라 스프링시큐리티쪽에서 식을 불러와 간단하게 구현한것이다.

예전에 세션에 로그인된 정보를 넣고 , <c:if> 문을 줄줄이 써서 로그인이 된것과 안된것을 구별하는 식으로

구현했는데

백엔드단에서 좀 복잡해졌지만 확실히 간결해 졌다.

그런데 스프링시큐리티를 처음접하는 입장에서는... 많이복잡하다...그러나 보안은 과해서 나쁠것없다라는 생각에

이런 저장방식은 유용한것같다.

728x90
반응형
LIST

'Spring공부 > 4-스프링시큐리티' 카테고리의 다른 글

프로젝트(1)  (0) 2021.10.21
자동 로그인  (0) 2021.10.21
커스텀 UserDetailsService  (0) 2021.10.19
JDBC를 이용하는 간편 인증/ 권한처리  (0) 2021.10.18
로그인과 로그아웃처리(2)  (0) 2021.10.18

댓글