메뉴 처리하기 - 사원의 job그룹에 따라 다른 메뉴 보여주기
로그인하는 사원은 부서 코드가 뭐냐에 따라 각각 다른 작업 그룹에 속해 있습니다. "업무관리"메뉴를 선택하면 로그인한 사용자가 어떤 업무에 속해 있냐에 따라 각각의 부서에 맞는 사용자의 메뉴로 접속될 수 있도록 하였습니다.

우리가 이전 작업에서는 세션을 사용했기 때문에 아래와 같이 세션에서 뷰에 대한 정보를 꺼내서 다음과 같이 작업하였습니다.

LoginSuccessHandler를 수정하여 SecurityLoginDTO에서 메뉴 정보를 꺼낸 후 가공하여 원하는 정보를 menupath에 세팅합니다. 이 작업은 EmpServiceImpl클래스의 login메소드에서 처리하던 작업입니다.
//로그인 사용자의 정보에서 메뉴 정보를 꺼내서 수정하여 다시 셋팅합니다.
if(dto!=null) {
String menuPath = dto.getMenupath();
System.out.println(menuPath);
menuPath= menuPath.substring(menuPath.indexOf("/")+1,menuPath.indexOf("_"));
dto.setMenupath(menuPath);
}
showjobMenu메서드의 매개변수에 인증된 사용자 정보를 받을 수 있도록 Principal principal을 추가합니다. principal은 java.security.Principal타입 이지만 로그인이 완료되면 내부에는 인증된 정보인 UsernamePasswordAuthenticationToken객체가 매핑됩니다.
매핑된 정보에서 SecurityLoginDTO객체를 꺼내서 menu정보를 꺼내 리턴하도록 합니다.
@RequestMapping(value="/menu/job.do",method=RequestMethod.GET)
public String showjobMenu(HttpServletRequest req,Principal principal ) throws Exception{
SecurityLoginDTO loginUser =
(SecurityLoginDTO)((UsernamePasswordAuthenticationToken)principal).getPrincipal();
String menupath = "";
menupath = loginUser.getMenupath();
return menupath;
}
"9401023jang/1234" 를 아이디와 패스워드로 입력하고 로그인합니다. "업무관리" 메뉴를 선택하면 "9401023 jang"사용자는 "d001"인사팀으로 "인사관리" 그룹에 속하기 때문에 왼쪽 메뉴에 "/menu/insa_menu.jsp"가 연결되어야 합니다.

"Logout"을 하고 "92115kim/1234"로 로그인을 하면 "92115kim"사용자는 "d003"으로 "j003"그룹으로 "전산관리" 그룹에 속하기 때문에 왼쪽 메뉴에 "/menu/it_menu.jsp"가 연결되어야 합니다.

각 사원이 속한 작업 그룹을 메뉴 위에 출력하기 위해 "/WEB-INF/layout/mainLayout.jsp" 파일에 taglib를 추가합니다.
<%@ taglib prefix="se" uri="http://www.springframework.org/security/tags" %>
사용자의 인증 정보를 담고 있는 principal의 job_category의 값을 연결합니다.
<se:authorize access="isAuthenticated()">
<se:authentication property="principal.job_category"/>
</se:authorize>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="tiles" uri="http://tiles.apache.org/tags-tiles" %>
<%@ taglib prefix="se" uri="http://www.springframework.org/security/tags" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet" href="/kimsaemERP/common/css/main.css" />
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css">
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>
<style>
/* Remove the navbar's default margin-bottom and rounded borders */
.navbar {
margin-bottom: 0;
border-radius: 0;
}
body{
color: black;
}
/* #toparea{
padding: 30px;
} */
/* body{
background-color: #edeef1
} */
</style>
<title>Insert title here</title>
</head>
<body>
<div>
<tiles:insertAttribute name="top"></tiles:insertAttribute>
</div>
<div style="background-color: #edeef1;padding: 20px;height: 800px">
<div class="row" style="margin-left: auto;margin-right: auto;">
<div class="col-sm-3"
style="background-color: white;margin-right:10px;padding: 0px ">
<div
style="border-color:white;height: 800px;">
<div style="background-color:#63cde7;padding: 20px;
font-family:HY-견고딕;font-size: 16pt;color: white;
font-weight: bolder;">
<se:authorize access="isAuthenticated()">
<se:authentication property="principal.job_category"/>
</se:authorize>
</div>
<tiles:insertAttribute name="menu"></tiles:insertAttribute>
</div>
</div>
<div class="col-sm-8" style="background-color: white;height: 800px;margin-left: auto;margin-right: auto;">
<tiles:insertAttribute name="content"></tiles:insertAttribute>
</div>
</div>
</div>
</body>
</html>
실행하면 로그인 사용자가 어떤 작업 그룹에 속해 있냐에 따라 다음과 같이 작업 그룹이 출력됩니다.

