로그인하는 사원은 부서 코드가 뭐냐에 따라 각각 다른 작업 그룹에 속해 있습니다. "업무관리"메뉴를 선택하면 로그인한 사용자가 어떤 업무에 속해 있냐에 따라 각각의 부서에 맞는 사용자의 메뉴로 접속될 수 있도록 하였습니다.
우리가 이전 작업에서는 세션을 사용했기 때문에 아래와 같이 세션에서 뷰에 대한 정보를 꺼내서 다음과 같이 작업하였습니다.
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>
실행하면 로그인 사용자가 어떤 작업 그룹에 속해 있냐에 따라 다음과 같이 작업 그룹이 출력됩니다.
'보안 > Spring Security' 카테고리의 다른 글
로그인 성공 했을 경우 처리할 일 - AuthenticationSuccessHandler (2) | 2019.09.15 |
---|---|
인증 유무에 따라 top메뉴 다르게 보이도록 설정하기 (0) | 2019.09.15 |
AuthenticationProvider커스트마이징하기 (0) | 2019.09.15 |
admin계정에서 모든 사원의 비밀번호를 암호화하기 (0) | 2019.09.15 |
password암호화 - ShaPasswordEncoder(회원가입 수정) (0) | 2019.09.13 |