초기소스
This commit is contained in:
@@ -0,0 +1,135 @@
|
||||
package com.wb.domainserver.interceptor.mngr;
|
||||
|
||||
|
||||
import com.wb.domainserver.domain.auth.service.AuthService;
|
||||
import com.wb.domainserver.domain.auth.vo.AuthVO;
|
||||
import com.wb.domainserver.realm.RealmContextHolder;
|
||||
import com.wb.domainserver.security.authentication.AnonymousUser;
|
||||
import com.wb.domainserver.security.authentication.MemberJwtContextHolder;
|
||||
import com.wb.domainserver.util.CookieUtils;
|
||||
import com.wb.domainserver.util.string.StringUtil;
|
||||
import jakarta.servlet.http.HttpServletRequest;
|
||||
import jakarta.servlet.http.HttpServletResponse;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.util.StringUtils;
|
||||
import org.springframework.web.method.HandlerMethod;
|
||||
import org.springframework.web.servlet.HandlerInterceptor;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
|
||||
public class MngrAuthInterceptor implements HandlerInterceptor{
|
||||
private static final Logger logger = LoggerFactory.getLogger(MngrAuthInterceptor.class);
|
||||
|
||||
|
||||
@Autowired
|
||||
private AuthService authService;
|
||||
|
||||
@Override
|
||||
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
|
||||
|
||||
|
||||
if (!(handler instanceof HandlerMethod handlerMethod)) {
|
||||
return true;
|
||||
}
|
||||
|
||||
//쿠키 쇼핑몰 코드 조회
|
||||
String cookieAuthSopmalCd = CookieUtils.getCookieValue("authSopmalCd", request);
|
||||
|
||||
|
||||
//쿠키 쇼핑몰 코드 없을 경우 쿠키 생성 및 쇼핑몰코드 변수저장
|
||||
if(!StringUtils.hasText(cookieAuthSopmalCd)){
|
||||
//통합관리자인경우
|
||||
if("ADMIN".equals(RealmContextHolder.getSopmalCdRealm())){
|
||||
CookieUtils.createCookie("authSopmalCd", "SYS", "/admin", true, request, response);
|
||||
cookieAuthSopmalCd = "SYS";
|
||||
|
||||
}else{
|
||||
CookieUtils.createCookie("authSopmalCd", RealmContextHolder.getSopmalCdRealm(), "/mngr", true, request, response);
|
||||
cookieAuthSopmalCd = RealmContextHolder.getSopmalCdRealm();
|
||||
}
|
||||
}
|
||||
|
||||
AnonymousUser user = MemberJwtContextHolder.getMemberInfo();
|
||||
|
||||
|
||||
//관리자 권한 조회
|
||||
boolean authChk = mngrAuthChk(request, response, user);
|
||||
|
||||
//해당 페이지에 접근권한이 없으면 alert
|
||||
boolean result = false;
|
||||
if(authChk){
|
||||
AuthVO authVO = new AuthVO();
|
||||
authVO.setMngrInnb(user.getUserInnb());
|
||||
authVO.setSopmalCd(cookieAuthSopmalCd);
|
||||
authVO.setSysDvCd(user.getSysDvCd());
|
||||
String url = request.getRequestURI();
|
||||
authVO.setFnctUri(url.equals("/") ? url + RealmContextHolder.getRealm().toLowerCase() : url);
|
||||
|
||||
// if("itrnt".equalsIgnoreCase(cookieAuthSopmalCd)){ //인트라넷 일 경우
|
||||
// authVO.setStrOperDv(user.getStrOperDv());
|
||||
// authVO.setTentGroup(user.getTentGroup());
|
||||
// authVO.setReprsntBrand(user.getReprsntBrand());
|
||||
//
|
||||
// result = authService.selectItrntAuthorSiteAt(authVO);
|
||||
// }else{
|
||||
//관리자 + 통합관리자 일 경우
|
||||
result = authService.selectAuthorSiteAt(authVO);
|
||||
// }
|
||||
}
|
||||
|
||||
|
||||
if(!result){
|
||||
|
||||
response.setStatus(HttpServletResponse.SC_FORBIDDEN);
|
||||
response.setContentType("text/html;charset=utf-8");
|
||||
response.getWriter().write("<script>alert('해당페이지에 접근 권한이 없습니다. 관리자에게 문의하세요.'); window.history.back();</script>");
|
||||
response.getWriter().flush();
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* 업무관리자 쇼핑몰 권한 조회
|
||||
* @param request req
|
||||
* @param response res
|
||||
* @param user 유저정보
|
||||
*/
|
||||
private boolean mngrAuthChk(HttpServletRequest request, HttpServletResponse response, AnonymousUser user){
|
||||
//권한 리스트 조회
|
||||
AuthVO authVO = new AuthVO();
|
||||
authVO.setMngrInnb(user.getUserInnb());
|
||||
List<String> sopmalList = authService.selectAuthorSopmalList(authVO);
|
||||
logger.debug("sopmalList {}", sopmalList);
|
||||
//로그인 요청 쇼핑몰 param 조회
|
||||
String queryString = request.getParameter("authSopmalCd");
|
||||
logger.debug("authSopmalCd param :: {}", queryString);
|
||||
//권한 리스트에 로그인 요청 쇼핑몰 param이 포함되면
|
||||
|
||||
String authSopmalCd = "";
|
||||
if (!StringUtil.isEmpty(queryString) && sopmalList.contains(queryString)) {
|
||||
// 로그인 요청 쇼핑몰 param 저장
|
||||
authSopmalCd = queryString;
|
||||
|
||||
} else {
|
||||
//쿠키에 권한 리스트중 첫번째 쇼핑몰 param 저장
|
||||
if(!sopmalList.isEmpty()){
|
||||
authSopmalCd = sopmalList.get(0);
|
||||
}else{
|
||||
return false;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
CookieUtils.createCookie("authSopmalCd", authSopmalCd, "/mngr", true, request, response);
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,410 @@
|
||||
package com.wb.domainserver.interceptor.mngr;
|
||||
|
||||
import com.wb.domainserver.domain.log.service.LogService;
|
||||
import com.wb.domainserver.domain.log.vo.MngrAccessLogVo;
|
||||
import com.wb.domainserver.interceptor.wrapper.MultipleReadableRequestWrapper;
|
||||
import com.wb.domainserver.realm.util.UrlExtractor;
|
||||
import com.wb.domainserver.security.authentication.AnonymousUser;
|
||||
import com.wb.domainserver.security.authentication.MemberJwtContextHolder;
|
||||
import com.wb.domainserver.util.string.StringUtil;
|
||||
import jakarta.servlet.http.Cookie;
|
||||
import jakarta.servlet.http.HttpServletRequest;
|
||||
import jakarta.servlet.http.HttpServletResponse;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.web.method.HandlerMethod;
|
||||
import org.springframework.web.servlet.HandlerInterceptor;
|
||||
import org.springframework.web.servlet.ModelAndView;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.security.MessageDigest;
|
||||
import java.security.NoSuchAlgorithmException;
|
||||
import java.security.SecureRandom;
|
||||
import java.util.Base64;
|
||||
import java.util.Enumeration;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
public class MngrLoggingInterceptor implements HandlerInterceptor {
|
||||
private static final Logger logger = LoggerFactory.getLogger(MngrLoggingInterceptor.class);
|
||||
|
||||
@Autowired
|
||||
private LogService logService;
|
||||
|
||||
@Override
|
||||
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
|
||||
|
||||
|
||||
//기기식별번호 쿠키 생성
|
||||
String agentId = agentIdHandleCookie(request, response);
|
||||
// 래핑된 요청 객체 생성
|
||||
HttpServletRequest wrappedRequest = new MultipleReadableRequestWrapper(request);
|
||||
|
||||
//관리자 접근로그 등록
|
||||
insertMngrAccessLog(wrappedRequest, response, handler, agentId);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
|
||||
HandlerInterceptor.super.postHandle(request, response, handler, modelAndView);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
|
||||
// if (handler instanceof HandlerMethod handlerMethod) {
|
||||
//
|
||||
// ContentCachingResponseWrapper responseWrapper = null;
|
||||
// if(response instanceof ContentCachingResponseWrapper) {
|
||||
// responseWrapper = (ContentCachingResponseWrapper) response;
|
||||
// } else{
|
||||
//
|
||||
// responseWrapper = new ContentCachingResponseWrapper(response);
|
||||
// }
|
||||
|
||||
|
||||
// 캐싱된 바이트 배열을 UTF-8로 변환하여 반환
|
||||
// String responseWrapperResult = new String(responseWrapper.getContentAsByteArray(), StandardCharsets.UTF_8);
|
||||
// logger.debug("responseWrapper ::: {}", responseWrapperResult);
|
||||
// }
|
||||
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* 관리자 접속 로그 등록 함수
|
||||
* @param logVo
|
||||
* @return void
|
||||
*/
|
||||
private void insertMngrAccessLog(HttpServletRequest request, HttpServletResponse response, Object handler, String agentId) throws IOException {
|
||||
|
||||
if (handler instanceof HandlerMethod handlerMethod) {
|
||||
|
||||
//호출 서비스 정보
|
||||
// 컨트롤러 클래스 이름
|
||||
String controllerName = handlerMethod.getBeanType().getSimpleName();
|
||||
|
||||
// 호출된 메소드 이름
|
||||
String methodName = handlerMethod.getMethod().getName();
|
||||
|
||||
// logger.debug("controllerName :: {} methodName :: {} ", controllerName, methodName);
|
||||
|
||||
|
||||
//요청 URL
|
||||
String url = request.getRequestURI();
|
||||
// logger.debug("url :: {}", url);
|
||||
|
||||
|
||||
/*관리자 로그 파라미터 지정 url */
|
||||
|
||||
String postParam =""; // POST 데이터 읽기
|
||||
String getParam =""; //GET 데이터 읽기
|
||||
|
||||
if(url.contains("/mngr/mbr") //관리자 - 회원
|
||||
|| url.contains("/mngr/setup/nbkk") // 관리자 - 설정 - 무통장
|
||||
|| url.contains("/crm/mbr") // CRM - 회원수정, 조회 등
|
||||
|| url.contains("/crm/dlvylc")){ //CRM - 회원배송지
|
||||
|
||||
if ("POST".equalsIgnoreCase(request.getMethod())) {
|
||||
if("application/json".equalsIgnoreCase( request.getContentType())){
|
||||
postParam = new String(request.getInputStream().readAllBytes(), request.getCharacterEncoding());
|
||||
// logger.debug("POST json Data: {}", postParam);
|
||||
}else{
|
||||
postParam = getParameterMap(request);
|
||||
// logger.debug("POST other Data: {}", postParam);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
//get 쿼리스트링
|
||||
getParam = request.getQueryString();
|
||||
|
||||
}
|
||||
|
||||
|
||||
// Controller 정보, Client IP, Headers 등 추가적인 로직 처리 가능
|
||||
//cookie agentId
|
||||
// logger.debug("agentId :: {} ", agentId);
|
||||
|
||||
//agent 정보
|
||||
String userAgent = request.getHeader("User-Agent");
|
||||
// logger.debug("userAgent :: {}", userAgent);
|
||||
|
||||
//request referer 정보 확인
|
||||
String referer = request.getHeader("Referer");
|
||||
// logger.debug("Referer :: {}", referer);
|
||||
|
||||
//ip 정보
|
||||
String clientIp = request.getHeader("X-Forwarded-For");
|
||||
if (!StringUtil.isEmpty(clientIp) && clientIp.contains(",")) {
|
||||
clientIp = clientIp.split(",")[0];
|
||||
}
|
||||
|
||||
if (StringUtil.isEmpty(clientIp)) {
|
||||
clientIp = request.getRemoteAddr();
|
||||
}
|
||||
// logger.debug("clientIp :: {}", clientIp);
|
||||
|
||||
request.setAttribute("LoggingClientIp", clientIp);
|
||||
|
||||
//host 정보
|
||||
String host = request.getHeader("X-Original-Host") != null ? request.getHeader("X-Original-Host") : UrlExtractor.getOriginalHost(request);
|
||||
// logger.debug("host :: {}", host);
|
||||
|
||||
//sessionId 정보
|
||||
String jSessionId = "";
|
||||
if(request.getCookies() != null){
|
||||
for(Cookie cookie : request.getCookies()){
|
||||
if(cookie.getName().equals("JSESSIONID")){
|
||||
jSessionId = cookie.getValue();
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// logger.debug("jSessionId :: {}", jSessionId);
|
||||
|
||||
|
||||
//서버 이름
|
||||
String serverName = request.getServerName();
|
||||
// logger.debug("serverName :: {}", serverName);
|
||||
|
||||
//접속환경
|
||||
String env;
|
||||
String upperUseAgent = userAgent.toUpperCase();
|
||||
if (upperUseAgent.contains("MOBILE") || upperUseAgent.contains("ANDROID") || upperUseAgent.contains("IPHONE")) {
|
||||
env = "MO";
|
||||
} else if (upperUseAgent.contains("TABLET") || upperUseAgent.contains("IPAD")) {
|
||||
env = "MO";
|
||||
} else {
|
||||
env = "PC";
|
||||
}
|
||||
|
||||
request.setAttribute("env", env);
|
||||
|
||||
AnonymousUser user = MemberJwtContextHolder.getMemberInfo();
|
||||
//고유 번호 등 개인식별 번호 확인
|
||||
// logger.debug("sopmalCd :::: {}",user.getSopmalCd());
|
||||
// logger.debug("userInnb :::: {}", user.getUserInnb());
|
||||
// logger.debug("MbrDvCd :::: {}", user.getMbrDvCd());
|
||||
//로그인 하였을 경우 url
|
||||
// logger.debug("accessUrl :::: {}", user.getAccessUrl());
|
||||
// logger.debug("clientId :::: {}", user.getClientId());
|
||||
|
||||
//접속 log insert
|
||||
MngrAccessLogVo logVo = new MngrAccessLogVo();
|
||||
logVo.setAgentId(agentId);
|
||||
logVo.setSesionId(jSessionId);
|
||||
|
||||
String userMngrTy = user.getSopmalCd();
|
||||
String mngrTy = "";
|
||||
if("mngr".equalsIgnoreCase(userMngrTy)){ //관리자
|
||||
mngrTy = "01";
|
||||
}
|
||||
if ("sys".equalsIgnoreCase(userMngrTy)){ // 통합관리자
|
||||
mngrTy = "03";
|
||||
}
|
||||
if("itrnt".equalsIgnoreCase(userMngrTy)){// 인트라넷
|
||||
mngrTy = "02";
|
||||
}
|
||||
|
||||
logVo.setMngrTyCd(mngrTy);
|
||||
logVo.setMngrInnb(user.getUserInnb());
|
||||
|
||||
|
||||
|
||||
String authSopmalCd = "";
|
||||
|
||||
//관리자 메인 진입시 쇼핑몰 선택했을 경우(로그인시)
|
||||
if( "/mngr/main".equals(request.getRequestURI()) && !StringUtil.isEmpty(request.getParameter("authSopmalCd"))){
|
||||
authSopmalCd = request.getParameter("authSopmalCd");
|
||||
}
|
||||
|
||||
//이후 사이트 이동시
|
||||
if(request.getCookies() != null){
|
||||
for(Cookie cookie : request.getCookies()){
|
||||
if(cookie.getName().equals("authSopmalCd")){
|
||||
authSopmalCd = cookie.getValue();
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
logVo.setSopmalCd(authSopmalCd);
|
||||
|
||||
|
||||
//메뉴 정보
|
||||
String[] menu = url.split("/"); // URL 추출
|
||||
String menuDepth1 = "";
|
||||
String menuDepth2 = "";
|
||||
String menuDepth3 = "";
|
||||
String menuDepth4 = "";
|
||||
for(int i = 0; i < menu.length; i++){
|
||||
if(i ==1){
|
||||
menuDepth1 = menu[i];
|
||||
}
|
||||
|
||||
if(i ==2){
|
||||
menuDepth2 = menu[i];
|
||||
}
|
||||
if(i ==3){
|
||||
menuDepth3 = menu[i];
|
||||
}
|
||||
if(i ==4){
|
||||
menuDepth4 = menu[i];
|
||||
}
|
||||
}
|
||||
// logger.debug("menuDepth1 :: {}", menuDepth1);
|
||||
// logger.debug("menuDepth2 :: {}", menuDepth2);
|
||||
// logger.debug("menuDepth3 :: {}", menuDepth3);
|
||||
// logger.debug("menuDepth4 :: {}", menuDepth4);
|
||||
|
||||
logVo.setMenuGroup(menuDepth1);
|
||||
logVo.setMenu(menuDepth2);
|
||||
|
||||
|
||||
//로그 타입
|
||||
String logType = "";
|
||||
//멤버 조회시(MEMBER)
|
||||
if("mbr".equals(menuDepth2)){
|
||||
logType = "01";
|
||||
//회원검색목록 폼 조회(MEMBERLIST)
|
||||
if(menuDepth3.contains("selectMbrListInqire")){
|
||||
logType = "02";
|
||||
}
|
||||
} else if ("ordr".equals(menuDepth2)) {
|
||||
|
||||
|
||||
//주문 상세(ORDER)
|
||||
if("selectOrdrDtlInqire".equals(menuDepth4)){
|
||||
logType = "03";
|
||||
}
|
||||
|
||||
//주문내역서 팝업 화면 이동 (주문내역 프린트 ORDERPRINT)
|
||||
if("selectOrdrDtstmnDwldPopupForm".equals(menuDepth4)){
|
||||
logType = "04";
|
||||
}
|
||||
|
||||
//(주문목록) 엑셀다운로드(ORDEREXCEL)
|
||||
if("selectExcelDwldListInqire".equals(menuDepth4)){
|
||||
logType = "08";
|
||||
}
|
||||
|
||||
// 출고 상세(EXPORT)
|
||||
if("selectDlivyDtlInqire".equals(menuDepth4)){
|
||||
logType = "05";
|
||||
}
|
||||
|
||||
//출고내역서 팝업 화면 이동 (출고내역 프린트 EXPORTPRINT)
|
||||
if("selectDlivyDtstmnDwldPopupForm".equals(menuDepth4)){
|
||||
logType = "10";
|
||||
}
|
||||
|
||||
//반품환불 상세 조회 (REFUND)
|
||||
if("selectRtngudRefndDtlInqire".equals(menuDepth4)){
|
||||
logType = "06";
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
logVo.setConectLogDvCd(logType);
|
||||
|
||||
|
||||
logVo.setReqstMth(methodName);
|
||||
logVo.setIp(clientIp);
|
||||
logVo.setConectEnvrnDv(env);
|
||||
logVo.setConectDomn(host);
|
||||
logVo.setConectUrl(url);
|
||||
logVo.setReqstData(!StringUtil.isEmpty(postParam)?postParam:getParam);
|
||||
|
||||
// logger.debug("logging interceptor logVO :::: {}", logVo );
|
||||
logService.insertMngrAccessLog(logVo);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 기기식별번호 쿠키 생성 함수
|
||||
* @param request
|
||||
* @return agentId
|
||||
*/
|
||||
private String agentIdHandleCookie(HttpServletRequest request, HttpServletResponse response) throws NoSuchAlgorithmException {
|
||||
String agentId = "";
|
||||
|
||||
//agentId 쿠키 있을 경우 가져옴
|
||||
if (request.getCookies() != null) {
|
||||
Cookie[] cookies = request.getCookies();
|
||||
for (Cookie cookie : cookies) {
|
||||
if (cookie.getName().equals("agent_id")) {
|
||||
agentId = cookie.getValue();
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// 기존 agentId가 없을경우, 새로 발급
|
||||
if (StringUtil.isEmpty(agentId)) {
|
||||
|
||||
//난수 생성
|
||||
SecureRandom random = SecureRandom.getInstanceStrong();
|
||||
|
||||
random.setSeed(System.currentTimeMillis());
|
||||
|
||||
agentId = String.valueOf(System.currentTimeMillis());
|
||||
|
||||
String host = request.getHeader("X-Forwarded-Host");
|
||||
if (host == null) {
|
||||
host = request.getServerName(); // 기본값으로 현재 요청의 호스트명 사용
|
||||
}
|
||||
String domain = UrlExtractor.getOriginalHost(host);
|
||||
|
||||
String cookieValue = agentId + ":" + md5(agentId + ":" + md5(System.currentTimeMillis() + ":" + random.nextInt())).substring(5, 10);
|
||||
Cookie agentIdCookie = new Cookie("agent_id", cookieValue);
|
||||
agentIdCookie.setMaxAge(86400 * 365 * 10); // 10년
|
||||
agentIdCookie.setDomain(domain);
|
||||
// agentIdCookie.setHttpOnly(true);
|
||||
agentIdCookie.setPath("/mngr");
|
||||
// agentIdCookie.setSecure(true);
|
||||
response.addCookie(agentIdCookie);
|
||||
agentId = cookieValue;
|
||||
|
||||
}
|
||||
|
||||
return agentId;
|
||||
}
|
||||
|
||||
/*쿠키 MD5 생성 함수 */
|
||||
private String md5(String input) throws NoSuchAlgorithmException {
|
||||
MessageDigest md = MessageDigest.getInstance("MD5");
|
||||
byte[] digest = md.digest(input.getBytes());
|
||||
return Base64.getEncoder().encodeToString(digest);
|
||||
}
|
||||
|
||||
/** 특정 쿠키 삭제(메뉴 클릭시에만 메뉴조회되게 하기 위해서) */
|
||||
private void deleteCookie(HttpServletResponse res, String CookieId){
|
||||
Cookie cookie = new Cookie(CookieId, null); // 삭제할 쿠키에 대한 값을 null로 지정
|
||||
cookie.setMaxAge(0); // 유효시간을 0으로 설정해서 바로 만료시킨다.
|
||||
res.addCookie(cookie); // 응답에 추가해서 없어지도록 함
|
||||
|
||||
}
|
||||
|
||||
// json 요청이 아닌 post 요청에서 파라미터를 Map으로 변환하는 메서드
|
||||
private String getParameterMap(HttpServletRequest request) {
|
||||
Map<String, String> paramMap = new HashMap<>();
|
||||
Enumeration<String> parameterNames = request.getParameterNames();
|
||||
|
||||
while (parameterNames.hasMoreElements()) {
|
||||
String paramName = parameterNames.nextElement();
|
||||
String paramValue = request.getParameter(paramName);
|
||||
paramMap.put(paramName, paramValue);
|
||||
}
|
||||
|
||||
return paramMap.toString();
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
@@ -0,0 +1,277 @@
|
||||
package com.wb.domainserver.interceptor.mngr;
|
||||
|
||||
import com.wb.domainserver.domain.admin.sys.author.service.BOMaAuthorService;
|
||||
import com.wb.domainserver.domain.admin.sys.author.vo.BOMaAuthorVO;
|
||||
import com.wb.domainserver.domain.admin.sys.menu.service.BOMaMenuService;
|
||||
import com.wb.domainserver.domain.admin.sys.menu.vo.BOMaMenuVO;
|
||||
import com.wb.domainserver.domain.gcone.mbr.mbr.service.BOMbrService;
|
||||
import com.wb.domainserver.domain.gcone.mbr.mbr.vo.BOMbrVO;
|
||||
import com.wb.domainserver.realm.RealmContextHolder;
|
||||
import com.wb.domainserver.security.authentication.AnonymousUser;
|
||||
import com.wb.domainserver.security.authentication.MemberJwtContextHolder;
|
||||
import com.wb.domainserver.util.string.StringUtil;
|
||||
import jakarta.servlet.http.Cookie;
|
||||
import jakarta.servlet.http.HttpServletRequest;
|
||||
import jakarta.servlet.http.HttpServletResponse;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.security.authentication.AnonymousAuthenticationToken;
|
||||
import org.springframework.security.core.Authentication;
|
||||
import org.springframework.security.core.context.SecurityContextHolder;
|
||||
import org.springframework.util.StringUtils;
|
||||
import org.springframework.web.servlet.HandlerInterceptor;
|
||||
import org.springframework.web.servlet.ModelAndView;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
public class MngrMenuInterceptor implements HandlerInterceptor {
|
||||
private static final Logger logger = LoggerFactory.getLogger(MngrMenuInterceptor.class);
|
||||
|
||||
|
||||
@Autowired
|
||||
private BOMaMenuService menuService;
|
||||
|
||||
@Autowired
|
||||
private BOMaAuthorService boMaAuthorService;
|
||||
|
||||
@Autowired
|
||||
private BOMbrService service;
|
||||
|
||||
// controller로 보내기 전에 처리하는 인터셉터
|
||||
@Override
|
||||
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
|
||||
throws Exception {
|
||||
|
||||
String accessUri = request.getRequestURI(); // 현재 요청된 URI
|
||||
|
||||
AnonymousUser mngr = MemberJwtContextHolder.getMemberInfo();
|
||||
String mngrDv = mngr.getMngrDv();
|
||||
|
||||
// 헤더의 사용자 이름을 표시하기 위해
|
||||
String sysDvCd = mngr.getSysDvCd();
|
||||
String userNm = "";
|
||||
String itrntDv = "";
|
||||
//인트라넷 분기처리
|
||||
if("04".equals(sysDvCd)){
|
||||
userNm = mngr.getTentcpnNm();
|
||||
itrntDv = mngr.getItrntDv();
|
||||
logger.info("MenuInterceptor itrntDv: {}", itrntDv);
|
||||
}else{
|
||||
userNm = mngr.getMbrNm();
|
||||
}
|
||||
request.setAttribute("userNm", userNm);
|
||||
request.setAttribute("itrntDv", itrntDv);
|
||||
// String accessUri = request.getRequestURI(); // 현재 요청된 URI
|
||||
|
||||
/** 메뉴 영역 조회 시작 **/
|
||||
int firstSlashIndex = accessUri.indexOf('/');
|
||||
int secondSlashIndex = accessUri.indexOf('/', firstSlashIndex + 1);
|
||||
|
||||
String systemType = "";
|
||||
if(!isAjaxRequest(request)) {
|
||||
// 시스템 구분 : 첫 번째 '/'와 두 번째 '/' 사이의 문자열을 추출
|
||||
if (firstSlashIndex != -1 && secondSlashIndex != -1 && firstSlashIndex + 1 < secondSlashIndex) {
|
||||
systemType = accessUri.substring(firstSlashIndex + 1, secondSlashIndex);
|
||||
logger.info("Extracted system type: {}", systemType);
|
||||
} else {
|
||||
systemType = accessUri.substring(firstSlashIndex + 1);
|
||||
logger.info("Could not find the substring between the first and second slashes.");
|
||||
}
|
||||
request.setAttribute("systemType", systemType);
|
||||
|
||||
// if(authorizationUrlChecker(systemType)){
|
||||
// response.setContentType("text/html; charset=UTF-8");
|
||||
// response.getWriter().write("<script>alert('허용되지 않는 요청입니다.'); location.href='/" + UrlExtractor.getSystemType() + "/main';</script>");
|
||||
// response.getWriter().flush();
|
||||
// return false;
|
||||
// }
|
||||
}
|
||||
|
||||
// 메뉴 클릭여부 체크
|
||||
String checkMenu = null;
|
||||
Cookie[] checkMenuCookies = request.getCookies();
|
||||
if (checkMenuCookies != null) {
|
||||
for (Cookie cookie : checkMenuCookies) {
|
||||
if ("checkMenu".equals(cookie.getName())) {
|
||||
checkMenu = cookie.getValue();
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if("/mngr/main".equals(accessUri) || "/admin/main".equals(accessUri) || accessUri.contains("/crm") || accessUri.contains("/itrnt")) {
|
||||
checkMenu = "Y";
|
||||
}
|
||||
|
||||
// FORM 호출 이후 ajax로 list호출될경우 메뉴 조회 할수 없는 case 방지
|
||||
if(!isAjaxRequest(request)) {
|
||||
if(!StringUtil.isEmpty(checkMenu) && "Y".equals(checkMenu)) {
|
||||
// 통합관리자, 관리자
|
||||
if("admin".equals(systemType) || "mngr".equals(systemType) || "crm".equals(systemType) || "itrnt".equals(systemType)) {
|
||||
|
||||
BOMaMenuVO vo = new BOMaMenuVO();
|
||||
vo.setUrl(accessUri);
|
||||
|
||||
// 사용자가 선택한 URL 정보를 통해 TOP메뉴의 MENU_CD 조회
|
||||
// 통합관리자
|
||||
if("admin".equals(systemType)){
|
||||
vo.setSopmalCd("SYS");
|
||||
vo.setUpmostMenuCd("sys");
|
||||
vo.setTopMenuCd("1");
|
||||
vo.setNextDeptCd1("2");
|
||||
vo.setNextDeptCd2("3");
|
||||
// 관리자
|
||||
}else if("mngr".equals(systemType)){
|
||||
|
||||
String cookieAuthSopmalCd = "";
|
||||
//관리자 메인 진입시 쇼핑몰 선택했을 경우(로그인시)
|
||||
if( "/mngr/main".equals(request.getRequestURI()) && !StringUtil.isEmpty(request.getParameter("authSopmalCd"))){
|
||||
cookieAuthSopmalCd = request.getParameter("authSopmalCd");
|
||||
}
|
||||
|
||||
if (request.getCookies() != null) {
|
||||
|
||||
Cookie[] cookies = request.getCookies();
|
||||
|
||||
for(Cookie cookie : cookies) {
|
||||
if("authSopmalCd".equals(cookie.getName())){
|
||||
cookieAuthSopmalCd = cookie.getValue();
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
if(!StringUtils.hasText(cookieAuthSopmalCd)){
|
||||
cookieAuthSopmalCd = RealmContextHolder.getSopmalCdRealm();
|
||||
}
|
||||
|
||||
|
||||
vo.setSopmalCd(cookieAuthSopmalCd);
|
||||
|
||||
vo.setUpmostMenuCd("adm");
|
||||
vo.setTopMenuCd("2");
|
||||
vo.setNextDeptCd1("3");
|
||||
vo.setNextDeptCd2("4");
|
||||
|
||||
//crm
|
||||
}else if("crm".equals(systemType) ){
|
||||
vo.setSopmalCd("CM");
|
||||
vo.setUpmostMenuCd("crm");
|
||||
}
|
||||
//인트라넷
|
||||
else{
|
||||
vo.setSopmalCd("ITRNT");
|
||||
vo.setUpmostMenuCd("itrnt");
|
||||
vo.setTopMenuCd("1");
|
||||
vo.setNextDeptCd1("2");
|
||||
vo.setNextDeptCd2("3");
|
||||
}
|
||||
|
||||
if(!"crm".equals(systemType)){
|
||||
// Top에서 사용자가 선택한 menuCd와 URL정보를 Cookie에서 가져오기
|
||||
String topMenuCd = null;
|
||||
String leftMenuCd = null;
|
||||
String upperMenuCd = null;
|
||||
String topMenuUrl = null;
|
||||
|
||||
Cookie[] cookies = request.getCookies();
|
||||
if (cookies != null) {
|
||||
for (Cookie cookie : cookies) {
|
||||
if ("topMenuCd".equals(cookie.getName())) {
|
||||
topMenuCd = cookie.getValue();
|
||||
} else if ("leftMenuCd".equals(cookie.getName())) {
|
||||
leftMenuCd = cookie.getValue();
|
||||
} else if ("topMenuUrl".equals(cookie.getName())) {
|
||||
topMenuUrl = cookie.getValue();
|
||||
} else if ("upperMenuCd".equals(cookie.getName())) {
|
||||
upperMenuCd = cookie.getValue();
|
||||
}
|
||||
if (leftMenuCd != null && topMenuCd != null && upperMenuCd != null && topMenuUrl != null) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
request.getSession().setAttribute("topMenuCd", topMenuCd);
|
||||
request.getSession().setAttribute("leftMenuCd", leftMenuCd);
|
||||
request.getSession().setAttribute("upperMenuCd", upperMenuCd);
|
||||
request.getSession().setAttribute("topMenuUrl", topMenuUrl);
|
||||
|
||||
|
||||
//TOP 메뉴 조회
|
||||
Map<String, Object> topMenuMap = new HashMap<>();
|
||||
topMenuMap.put("menuList", menuService.selectBOTopMenuListInqire(vo));
|
||||
request.setAttribute("topMenuList", topMenuMap);
|
||||
|
||||
//LEFT 메뉴 조회
|
||||
if (!StringUtil.isEmpty(topMenuCd)) {
|
||||
vo.setUpperMenuCd(topMenuCd);
|
||||
vo.setTopMenuCd("2");
|
||||
Map<String, Object> leftMenuMap = new HashMap<>();
|
||||
leftMenuMap.put("menuList", menuService.selectBOTopMenuListInqire(vo));
|
||||
request.setAttribute("leftMenuList", leftMenuMap);
|
||||
}
|
||||
}else{
|
||||
//crm 메뉴 조회
|
||||
Map<String, Object> crmMenuList = new HashMap<>();
|
||||
crmMenuList.put("menuList", menuService.selectBOCrmMenuListInqire(vo));
|
||||
request.setAttribute("crmMenuList", crmMenuList);
|
||||
}
|
||||
if( "crm".equals(systemType) || "itrnt".equals(systemType)){
|
||||
request.setAttribute("accessUri", accessUri);
|
||||
}
|
||||
|
||||
//권한 있는 사이트 조회
|
||||
if ("mngr".equalsIgnoreCase(systemType)||"crm".equalsIgnoreCase(systemType)) {
|
||||
Map<String, Object> siteList = new HashMap<>();
|
||||
BOMaAuthorVO boMaAuthorVO = new BOMaAuthorVO();
|
||||
boMaAuthorVO.setMngrInnb(String.valueOf(mngr.getUserInnb()));
|
||||
|
||||
//권한에 있는 쇼핑몰만 조회
|
||||
siteList.put("siteList", boMaAuthorService.selectBOAuthorSiteList(boMaAuthorVO));
|
||||
request.setAttribute("siteList", siteList.get("siteList"));
|
||||
}
|
||||
|
||||
request.setAttribute("isAuthenticated", isAuthenticated());
|
||||
deleteCookie(response, "checkMenu");
|
||||
}
|
||||
}
|
||||
}
|
||||
/** 메뉴 영역 조회 종료 **/
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
|
||||
HandlerInterceptor.super.postHandle(request, response, handler, modelAndView);
|
||||
}
|
||||
|
||||
/** Ajax 여부 확인 */
|
||||
private boolean isAjaxRequest(HttpServletRequest req) {
|
||||
String header = req.getHeader("x-requested-with");
|
||||
if ("XMLHttpRequest".equals(header)){
|
||||
return true;
|
||||
}else{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/** 특정 쿠키 삭제(메뉴 클릭시에만 메뉴조회되게 하기 위해서) */
|
||||
public void deleteCookie(HttpServletResponse res, String CookieId){
|
||||
Cookie cookie = new Cookie(CookieId, null); // 삭제할 쿠키에 대한 값을 null로 지정
|
||||
cookie.setMaxAge(0); // 유효시간을 0으로 설정해서 바로 만료시킨다.
|
||||
res.addCookie(cookie); // 응답에 추가해서 없어지도록 함
|
||||
}
|
||||
|
||||
|
||||
/** 로그인 여부 체크 */
|
||||
private boolean isAuthenticated() {
|
||||
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
|
||||
if (authentication == null || authentication instanceof AnonymousAuthenticationToken) {
|
||||
return false;
|
||||
}
|
||||
return authentication.isAuthenticated();
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user