개발 블로그

[eGov] 스프링 시큐리티 커스텀하기 본문

전자 정부 프레임워크

[eGov] 스프링 시큐리티 커스텀하기

토도 2023. 4. 4. 17:26

컨트롤러나 view 설정없이 기본으로 이 화면이 뜨게되는데 맘에 안 드니 바꾸기로 한다

 

 

[WEB-INF] - [ jsp ] - [ member ] 

우선 login.jsp를 만들어서 아래와 같이 입력

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form"%>
<%@ taglib uri="http://www.springframework.org/security/tags" prefix="sec" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
<style>
	 .login-page {
	  width: 360px;
	  padding: 8% 0 0;
	  margin: auto;
	}
	
	.form {
	  position: relative;
	  z-index: 1;
	  background: #ffffff;
	  max-width: 360px;
	  margin: 0 auto 100px;
	  padding: 45px;
	  text-align: center;
	  box-shadow: 0 0 20px 0 rgba(0, 0, 0, 0.2), 0 5px 5px 0 rgba(0, 0, 0, 0.24);
	}
	
	.form input {
	  font-family: "Roboto", sans-serif;
	  outline: 0;
	  background: #f2f2f2;
	  width: 100%;
	  border: 0;
	  margin: 0 0 15px;
	  padding: 15px;
	  box-sizing: border-box;
	  font-size: 14px;
	}
	
	.form button {
	  font-family: "Roboto", sans-serif;
	  text-transform: uppercase;
	  outline: 0;
	  background: #4caf50;
	  width: 100%;
	  border: 0;
	  padding: 15px;
	  color: #ffffff;
	  font-size: 14px;
	  cursor: pointer;
	}
	
	.form button:hover,
	.form button:active,
	.form button:focus {
	  background: #43a047;
	}
	
	.form .message {
	  margin: 15px 0 0;
	  color: #b3b3b3;
	  font-size: 12px;
	}
	
	.form .message a {
	  color: #4caf50;
	  text-decoration: none;
	}
	
	.form .register-form {
	  display: none;
	}
	
	.container {
	  position: relative;
	  z-index: 1;
	  max-width: 300px;
	  margin: 0 auto;
	}
	
	.container:before,
	.container:after {
	  content: "";
	  display: block;
	  clear: both;
	}
	
	.container .info {
	  margin: 50px auto;
	  text-align: center;
	}
	
	.container .info h1 {
	  margin: 0 0 15px;
	  padding: 0;
	  font-size: 36px;
	  font-weight: 300;
	  color: #1a1a1a;
	}
	
	.container .info span {
	  color: #4d4d4d;
	  font-size: 12px;
	}
	
	.container .info span a {
	  color: #000000;
	  text-decoration: none;
	}
	
	.container .info span .fa {
	  color: #ef3b3a;
	}	 
</style>
</head>
<body>
<c:url value="/login" var="loginUrl" />
<form:form class="form-signin" method="POST" action="${loginUrl}">
<c:if test="${param.error != null}">
        <p style="color: blue">아이디와 비밀번호가 잘못되었습니다.</p>
</c:if>
 <div class="login-page">
    <div class="form">
        <input type="text" name="userid" placeholder="Username" />
        <input type="password" name="password" placeholder="Password" />
        <button type="submit">Login</button>
    </div>
  </div>
</form:form>
</body>
</html>

 

앞서 taglib dependency를 등록해주었기 때문에 스프링 시큐리티 태그를 사용할 수 있다.

 

<!-- JSP에서 Spring Security Tag 사용을 위한 dependency 등록 Start -->	
		<dependency>
			<groupId>org.springframework.security</groupId>
			<artifactId>spring-security-taglibs</artifactId>
			<version>4.2.1.RELEASE</version>
		</dependency> 
<!-- JSP에서 Spring Security Tag 사용을 위한 dependency 등록 End -->

 

여기서 중요한 것은 <form> 태그의 action URL method 방식,

그리고 아이디와 패스워드를 입력하는 <input> 태그의 name이

로그인 체크 로직을 간단하게 구현하기 위해 jstl 태그를 이용했다

 

그리고 컨트롤러에 메소드 생성, 방금 만든 jsp를 연결

 

 

<?xml version="1.0" encoding="UTF-8"?>
<beans:beans 
	xmlns="http://www.springframework.org/schema/security"  
	xmlns:beans="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:security="http://www.springframework.org/schema/security"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
		http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-4.2.xsd">

 	<http auto-config="true" use-expressions="true">
        <intercept-url pattern="/member/loginPage.do"	access="permitAll"/>
        <intercept-url pattern="/**" access="hasRole('ROLE_ADMIN')" />  
  		
        <form-login login-page="/member/loginPage.do" 
				username-parameter="userid" 
				password-parameter="password"  
				authentication-failure-url="/member/loginPage.do?error" 
	 			default-target-url="/"  
				/>
				     
		<session-management> 
			<concurrency-control max-sessions="1" expired-url="/" />
		</session-management>             
    </http>
    <authentication-manager>
        <authentication-provider>
            
            <jdbc-user-service data-source-ref="dataSource"

            	users-by-username-query=
            		 "SELECT USERID AS USERNAME, 
            				 PASSWORD,
       						 1 AS ENABLED 
                    		 FROM SS_MEMBER 
                     		 WHERE USERID = ?"
				authorities-by-username-query=
					 "SELECT USERID AS USERNAME, 
					 		 AUTHORITY 
					         FROM SS_MEMBER
					         WHERE USERID = ?"							     						     						                
            /> 
            
        </authentication-provider>
    </authentication-manager>
</beans:beans>

 

intercept-url 

: 설정 잘 해야함 이 순서 때문에 오류가 난다

   loginform 을 만들어 놓고 추가하지 않아도 오류가 생김

   loginform 순서는 제일 앞에 위치하게 한다

 

<form-login login-page="/member/loginPage.do" 
 username-parameter="userid" 
 password-parameter="password"  
 authentication-failure-url="/member/loginPage.do?error" 
 default-target-url="/" />

: form 로그인에 대한 custom 설정이다

 

SpEL 문법 : use-expressions=true를 해야지 사용 가능

 

표현식  설명 
 hasRole('role1')   권한(role1)을 가지고 있는 경우 접근 가능
 hasAnyRole('role1', 'role2')  권한들(role1, role2) 중 하나라도 가지고 있는 경우 접근  
 permitAll  권한이 없어도 모든 곳에 접근 가능 
 denyAll   권한이 있어도 모든 곳에 접근 불가능 
 isAnonymouse()  인증하지 않은 게스트 사용자 여부 
 isRememberMe()  Remember-me 로그인 기능을 사용하는 사용자 여부
 isAuthenticated()   인증한 사용자 여부 
 isFullyAuthenticated()  게스트 사용자도 아니고 Remember-me 사용하는 사용자도 아닌지 여부