본문 바로가기
Spring/ICS단계적보안성평가 프로젝트(한이음)

[Spring] ICS단계적보안성평가WEB - 사번 유효성 검사 및 승인 코드

by 태옹 2021. 7. 27.

회원가입을 한 경우 바로 로그인을 할 수 있는 것이 아니라, 관리자의 승인을 받아야 로그인할 수 있다.

회원가입 시 입력한 사번에 대해 유효성 검사를 진행한 후, 성공적으로 인증이 되면 승인 버튼이 활성화가 된다.

 

 

MVC부분

 

1. UserVO

package com.hanium.domain;

import java.util.Date;

import lombok.Data;

@Data
public class UserVO {
	private String userid;	//사번
	private String userptype;
	private String userdept;
	private String username;
	private String userpw;
	private String useremail;
	private String userbirth;
	private String userphone;
	private boolean valid;	//유효성 검사가 완료된 경우 체크하는 플래그
	private boolean permission;	//승인 허가를 받은 경우 체크하는 플래그
	private Date reqdate;
}

 

2-1. UserMapper(interface)

package com.hanium.mapper;

import java.util.List;

import com.hanium.domain.UserVO;

public interface UserMapper {
    ...
    public UserVO findUserValidity(String userid);	//1. 얘가 먼저 존재하는 사번인지 확인하고
    public int userValidityCheck(UserVO user);		//2. 검사가 완료되면 valid(유효성)값을 체크함
    public int userPermission(UserVO user);		//3. 유효한 사번이면 관리자가 승인
    ...
}

 

2-2. UserMapper(xml) 일부

(유효성 검사할 때 user테이블과 조인하는 테이블 : emp, dept)

<select id="findUserValidity"
    resultType="com.hanium.domain.UserVO">
    SELECT *
    FROM user, emp, dept
    WHERE user.userid = emp.empid and dept.deptcode = emp.empDeptCode and
    (dept.deptname = user.userdept and dept.deptptype = user.userptype)
    and userid=#{userid}
</select>
<update id="userValidityCheck">
    UPDATE user
    SET valid=1
    WHERE userid = #{userid}
</update>
<update id="userPermission">
    update user
    set permission=1
    where userid=#{userid} and
    valid=1;
</update>

 

 

3-1. UserService(interface)

package com.hanium.service;

import java.util.List;

import com.hanium.domain.UserVO;

public interface UserService {
	...
	public boolean findUserValidity(String userid);		//사번 인증 (유효성확인)
	public boolean setUserValid(UserVO user);		//사번 인증 (valid체크)
	public boolean setUserPermission(UserVO user);		//유저 승인
}

 

3-2. UserServiceImpl

package com.hanium.service;

import java.util.List;

import org.springframework.stereotype.Service;

import com.hanium.domain.UserVO;
import com.hanium.mapper.UserMapper;

import lombok.AllArgsConstructor;

@Service
@AllArgsConstructor
public class UserServiceImpl implements UserService {

	private UserMapper mapper;

	...
    
    @Override
	public boolean findUserValidity(String userid) {
		UserVO validUser = mapper.findUserValidity(userid);
		if(validUser==null) {
			return false;
		}
		else
			return true;
	}

	@Override
	public boolean setUserValid(UserVO user) {
		return mapper.userValidityCheck(user)==1;
	}

	@Override
	public boolean setUserPermission(UserVO user) {
		return mapper.userPermission(user)==1;
	}
}

 

4. UserController

package com.hanium.controller;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.mvc.support.RedirectAttributes;

import com.hanium.domain.UserVO;
import com.hanium.service.UserService;

import lombok.AllArgsConstructor;
import lombok.extern.log4j.Log4j;

@Log4j
@Controller
@RequestMapping("/user/*")
@AllArgsConstructor
public class UserController {
	private UserService service;
	...
    
	@ResponseBody
	@RequestMapping(value = "/valid")
	public String valid(@RequestParam("userid") String userid) {
		userid = userid.toString();
		UserVO user = service.get(userid);
		log.info(user.getUsername());

		// 1. 사번 유효성 검증
		if (service.findUserValidity(userid)) {
			log.info("[ CONTROLLER ] 사번이 유효합니다.");
			// 2. user valid check
			service.setUserValid(user);
			return "success";

		} else {
			log.info("[ CONTROLLER ] 사번이 유효하지 않음");
			return "fail";
		}
	}

	@ResponseBody
	@RequestMapping("/permission")
	public String permission(@RequestParam("userid") String userid) {
		userid=userid.toString();
		UserVO user = service.get(userid);
		log.info(user.getUsername());
		service.setUserPermission(user);
		return "success";
	}
}

 


jsp부분

 

5. "인증이 완료되었습니다(혹은 실패했습니다)."를 띄워주는 모달창

(이거 bootstrap모달 가져온거라서 직접 쓰려면 import 필요!)

<!-- Modal -->
<div class="modal fade" id="staticBackdrop" data-backdrop="static"
	data-keyboard="false" tabindex="-1"
	aria-labelledby="staticBackdropLabel" aria-hidden="true">
	<div class="modal-dialog modal-dialog-centered" id="modal_this">
		<div class="modal-content">
			<div class="modal-header">
				<h5 class="modal-title" id="staticBackdropLabel">사번 인증</h5>
				<button type="button" class="close" data-dismiss="modal"
					aria-label="Close">
					<span aria-hidden="true">&times;</span>
				</button>
			</div>
			<div class="modal-body">
				<span id="user_valid">사번 인증이 완료되었습니다.</span>
			</div>
			<div class="modal-footer">
				<button type="button" class="btn btn-danger" data-dismiss="modal"
					id="modal_ok" onclick="location.reload();">닫기</button>
			</div>
		</div>
	</div>
</div>

 

6. 테이블 (jstl로 리스트 정보를 띄워줌)

인증이 완료된 경우의 인증버튼과 인증 미완료된 경우의 승인버튼에는 disable상태로 지정되도록 조건문을 사용한다.

${userRequest}

더보기

<c:foreach items="${userRequest}">의 userRequest는 아래의 userRequestList컨트롤러에서 받아온 정보임

@GetMapping("/user_request")
public void userRequestlist(Model model) {
	model.addAttribute("userRequest", service.getUserRequest());
}
<table class="table">
	<thead>
		<tr>
			<th style="width: 30px;">Id</th>
			<th>승인 요청 날짜</th>
			<th>발전소 구분</th>
			<th>부서명</th>
			<th>사번</th>
			<th>사번 인증</th>
			<th>사원명</th>
			<th>승인</th>
		</tr>
	</thead>
	<tbody id="table_body">
		<c:forEach items="${userRequest}" var="request" varStatus="status">
			<tr>
				<td style="width: 30px;"><c:out value="${status.count}" /></td>
				<td><fmt:formatDate pattern="yyyy-MM-dd"
						value="${request.reqdate}" /></td>
				<td><c:out value="${request.userptype}" /></td>
				<td><c:out value="${request.userdept}" /></td>
				<td><c:out value="${request.userid}" /></td>
				<td><c:if test="${request.valid eq false}">
						<button class="btn btn-danger" data-oper="valid"
							data-toggle="modal" id="assess_btn"
							data-target="#staticBackdrop"
							onclick="validate('${request.userid}')">인증</button>
					</c:if> <c:if test="${request.valid eq true}">
						<button class="btn btn-danger" disabled="disabled">완료</button>
					</c:if></td>
				<td><c:out value="${request.username}" /></td>
				<c:if test="${request.valid eq true}">
					<td><button class="btn btn-success" data-oper="permission"
							onclick="permiss('${request.userid}')">승인 확인</button></td>

				</c:if>
				<c:if test="${request.valid eq false}">
					<td><button type="button" class="btn btn-success"
							disabled="disabled">인증 필요</button></td>
				</c:if>
			</tr>
		</c:forEach>
	</tbody>
</table>

 

 

7. javascript+ajax 코드

<script>
	/*사번 인증*/
	function validate(id) {
		$.ajax({
			contentType : "application/json; charset=utf-8;",
			type : "GET",
			url : "/user/valid",
			data : {
				"userid" : id
			},
			success : function(response) {
				//conlose.log(response);
				if (response == "success") {
					$("#user_valid").text("인증에 성공하였습니다.");
				} else
					$("#user_valid").text("인증에 실패하였습니다.");

			},
			error : function(request, status, error) {
				alert("code:" + request.status + "\n" + "message:"
						+ request.responseText + "\n" + "error:" + error);
			}
		})
	}

	/*유저 승인*/
	function permiss(id) {
		if (confirm("사용자를 승인하시겠습니까?") == true) {
			$.ajax({
				contentType : "application/json; charset=utf-8;",
				type : "GET",
				url : "/user/permission",
				data : {
					"userid" : id
				},
				success : function(response) {
					//conlose.log(response);
					alert("승인이 완료되었습니다.");
					location.reload();
				},
				error : function(request, status, error) {
					alert("code:" + request.status + "\n" + "message:"
							+ request.responseText + "\n" + "error:" + error);
				}
			})
		} else {
			return;
		}

	}
</script>

 

댓글