오늘은 몰랐으면 내일은 알면 된다

[Spring Security] 2. 커스텀 로그인 화면, 권한별 접근제어 본문

Java/Spring

[Spring Security] 2. 커스텀 로그인 화면, 권한별 접근제어

마스터피쓰 2021. 3. 8. 14:29

예제 및 내용은 아래의 블로그를 주로 참고하였다.

offbyone.tistory.com/91

 

스프링프레임웍 - Spring Security(2) : 커스텀 로그인 화면 및 권한에 따른 접근 제어

앞의 글 "스프링프레임웍 - Spring Security(1) : 기본 설정"에 이어 이번에는 커스텀 로그인 화면을 만드는 방법을 알아보겠습니다. 전체소스는 하단에 추가되어 있습니다. 1. 스프링 시큐리티 태그라

offbyone.tistory.com

 

1. 스프링 시큐리티 태그 라이브러리 사용을 위한 의존성을 추가한다.

 

		<dependency>
			<groupId>org.springframework.security</groupId>
			<artifactId>spring-security-taglibs</artifactId>
			<version>${spring.security.version}</version>
			<type>jar</type>
			<scope>compile</scope>
		</dependency>

 

2. 커스텀 로그인 화면을 위한 security-context.xml 수정

 

블로그 예제에서는 url 모두에 .do 확장자가 붙는데 익숙하지가 않아서 찾아보았다.

결론만 이야기하자면 현재는 딱히 쓰이지 않는 모양이다. 간단히만 알아두도록 하자.

 

okky.kr/article/262795

 

OKKY | 초보자를 위한 .do 확장자의 역사

계정 짤릴 각오로 올립니다. 이유는 아래에 설명하겠습니다. 초보자분들이 자바웹(스프링/정부표준 등)에 입문하실 때 강사나 선배 개발자분들이 표준을 가르칩니다. 그때 가장 질리게 들을 확

okky.kr

 

	<http use-expressions="true">
		<intercept-url pattern="/" access="permitAll"/>
		<intercept-url pattern="/login/loginForm" access="permitAll"/>
		<intercept-url pattern="/admin/**" access="hasRole('ADMIN')"/>
		<intercept-url pattern="/**" access="hasAnyRole('USER, ADMIN')"/>
		
		<form-login login-page="/login/loginForm"
			default-target-url="/"
			authentication-failure-url="/login/loginForm?error"
			username-parameter="id"
			password-parameter="password"/>
		
		<logout logout-url="/logout" logout-success-url="/"/>
		
		<access-denied-handler error-page="/login/accessDenied"/>
		
		<csrf disabled="true"/>
	</http>
	
	<authentication-manager>
		<authentication-provider>
			<user-service>
				<user name="user" password="password" authorities="ROLE_USER"/>
				<user name="admin" password="password" authorities="ROLE_ADMIN"/>
			</user-service>
		</authentication-provider>
	</authentication-manager>

 

<intercept-url pattern="/" access="permitAll"/> : 메인화면은 로그인 없이 접근 가능하게 한다.

 

<intercept-url pattern="/login/loginForm" access="permitAll"/> : 로그인 폼 URL에도 로그인하지 않아도 접근 가능하게 한다.


<intercept-url pattern="/admin/**" access="hasRole('ADMIN')"/> : /admin/** 은 ADMIN 권한이 있어야 접근가능하게 한다.


<intercept-url pattern="/**" access="hasAnyRole('USER, ADMIN')"/> : 그 외 나머지 URL에 대해서는 USER나 ADMIN 권한이 있으면 접근이 가능하게 한다.

 

 

<form-login> 태그 커스터마이징

 

login-page="/login/loginForm" : 커스텀한 로그인 페이지를 지정한다.


default-target-url="/" : 로그인 후 기본적으로 보여지는 페이지이다. 특정한 페이지에서 로그인을 한 경우에는 로그인 후 그 페이지로 이동한다.

 

authentication-failure-url="/login/loginForm?error" : 로그인 실패시 보여줄 페이지를 지정한다. 기본값은 /login?error이다. 여기서는 로그인 폼 페이지를 다시 보여준다.



<logout> 태그 커스터마이징

logout-url="/logout" : 로그아웃에 사용될 페이지를 지정한다. 기본값은 /logout이다.

 

logout-success-url="/" : 로그아웃에 성공했을 때 이동할 페이지를 지정한다. 여기서는 메인화면인 home.jsp로 가게 했다.

 

<access-denied-handler error-page="/login/accessDenided"/> : 로그인 했으나 권한이 없는 경우 보여줄 페이지를 지정한다.

 

Controller 소스

 

	@RequestMapping(value = "/", method = RequestMethod.GET)
	public String home() {
		
		return "/home";
	}
HomeController.java

 

	@RequestMapping(value = "/login/loginForm", method = RequestMethod.GET)
	public String loginForm() {
		return "/login/loginForm";
	}
	@RequestMapping(value = "/admin/adminHome", method = RequestMethod.GET)
	public String adminHome() {
		return "/admin/adminHome";
	}
	
	@RequestMapping(value = "/login/accessDenied", method = RequestMethod.GET)
	public String accessDenied() {
		return "/login/accessDenied";
	}
	
	@RequestMapping(value = "/intro/introduction", method = RequestMethod.GET)
	public String introduction() {
		return "/intro/introduction";
	}
MainController.java

 

 

3. home.jsp 와 커스텀 로그인화면 loginForm.jsp

 

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="sec" uri="http://www.springframework.org/security/tags" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Home</title>
</head>
<body>
	
	<h1>Home</h1>
	<sec:authorize access="isAnonymous()">
		<p>
			<a href="<c:url value="/login/loginForm"/>">로그인</a>
		</p>
	</sec:authorize>
	
	<sec:authorize access="isAuthenticated()">
		<form action="${pageContext.request.contextPath}/logout" method="POST">
			<input type="submit" value="로그아웃">
		</form>
	</sec:authorize>
	
	<ul>
		<li>
			<a href="<c:url value="/intro/introduction"/>">소개 페이지</a>
		</li>
		<li>
			<a href="<c:url value="/admin/adminHome"/>">관리자 홈</a>
		</li>
	</ul>
</body>
</html>
home.jsp

 

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>로그인 페이지</title>
</head>
<body>

	<h3>아이디와 비밀번호를 입력하세요.</h3>
	
	<form name="loginForm" action="<c:url value="/login"/>" method="POST">
		<c:if test="${param.error != null }">
			<p>아이디와 비밀번호가 잘못되었습니다.</p>
		</c:if>
		<c:if test="${param.logout != null }">
			<p>로그아웃 하였습니다.</p>
		</c:if>
		<p>
			<label for="username">아이디</label>
			<input type="text" id="id" name="id"/>
		</p>
		<p>
			<label for="password">비밀번호</label>
			<input type="text" id="password" name="password"/>
		</p>
		<input type="submit" class="btn" value="로그인">
	</form>
</body>
</html>
loginForm.jsp

 

 

 

home.jsp - 로그아웃시에도 home으로 온다
loginForm.jsp
로그인 성공
로그인 실패한 경우

 

권한없는 페이지에 접근한 경우

 

 

내장표현식 관련으로는 출처 블로그를 참조하자.