오늘은 몰랐으면 내일은 알면 된다
[Spring Security] 2. 커스텀 로그인 화면, 권한별 접근제어 본문
예제 및 내용은 아래의 블로그를 주로 참고하였다.
스프링프레임웍 - 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 | 초보자를 위한 .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





내장표현식 관련으로는 출처 블로그를 참조하자.
'Java > Spring' 카테고리의 다른 글
| [Spring Security] 3. 사용자 권한 정보 DB 연동하기 (0) | 2021.03.09 |
|---|---|
| [Spring] DAO 구현하기 (0) | 2021.03.08 |
| [Spring Security] 1.개요, 기본 설정 (0) | 2021.03.08 |
| [Spring] MySQL, Mybatis 연동하기 (0) | 2021.03.05 |
| [Spring framework] Context root 변경하기 (0) | 2021.02.25 |