IT/development

[springBoot] ์ธํ„ฐ์…‰ํ„ฐ๋ฅผ ํ†ตํ•ด ๋ฉ”๋‰ด ์ ‘๊ทผ ๊ด€๋ฆฌ

์•Œ ์ˆ˜ ์—†๋Š” ์‚ฌ์šฉ์ž 2023. 9. 24.

์‹œ์Šคํ…œ์—์„œ๋Š” ๋ณด์•ˆ ๋•Œ๋ฌธ์— ๋กœ๊ทธ์ธํ•œ ์‚ฌ์šฉ์ž์˜ ๋ฉ”๋‰ด ์ ‘๊ทผ ๋ฒ”์œ„๋ฅผ ์ œํ•œํ•ด์•ผ ํ•œ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด ์‹œ์Šคํ…œ๊ด€๋ฆฌ์ž๋Š” ์‹œ์Šคํ…œ๊ด€๋ฆฌ ๋ฉ”๋‰ด๋งŒ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•˜๊ณ  ๊ธ‰์—ฌ๊ด€๋ฆฌ์ž๋Š” ๊ธ‰์—ฌ๋ฉ”๋‰ด์—๋งŒ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•œ๋‹ค.

์ธํ„ฐ์…‰ํ„ฐ๋ฅผ ํ†ตํ•ด ์•„๋ž˜์ฒ˜๋Ÿผ ๊ตฌํ˜„ํ–ˆ๋‹ค.

package kr.dev.common.interceptor;

import kr.dev.cmmn.mapper.CmmnMapper;
import kr.dev.cmmn.model.MenuVo;
import kr.dev.cmmn.service.CmmnService;
import kr.dev.user.model.EmpVO;
import kr.dev.user.service.UserService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.servlet.HandlerInterceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.util.List;

@Slf4j
//๊ถŒํ•œ์ฒดํฌ ์ธํ„ฐ์…‰ํ„ฐ
public class AuthInterceptor implements HandlerInterceptor {

    @Autowired
    UserService userService;

    @Autowired
    CmmnService commonService;

    @Autowired
    CmmnMapper cmmnMapper;

    /**
     * ๋ฉ”๋‰ด ์ ‘๊ทผ ๊ถŒํ•œ ์ฒดํฌ ์ธํ„ฐ์…‰ํ„ฐ
     * @param request current HTTP request
     * @param response current HTTP response
     * @param handler chosen handler to execute, for type and/or instance evaluation
     * @return
     * @throws Exception
     */
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {

        String requestURI = request.getRequestURI();
        log.info("requestURI = [{}]", requestURI);
        //get sessionInfo
        EmpVO vo = (EmpVO) request.getSession().getAttribute("vo");
        //๋ฉ”๋‰ด ์ ‘๊ทผ ์ตœ์†Œ ๋ ˆ๋ฒจ ์ฒดํฌ
        String requiredAuthLevel = getMenuRequiredAuthLevel(requestURI);

        /*****๊ด€๋ฆฌ์ž์ธ ๊ฒฝ์šฐ****************************/
        if (Integer.parseInt(vo.getEmpAuthLevel()) >= Integer.parseInt(requiredAuthLevel)) {
            //๋ฉ”๋‰ด ์ ‘๊ทผ๊ฐ€๋Šฅ ์—ฌ๋ถ€ ์ฒดํฌ
            if (userHasMenuAccess(vo.getEmpId(), requestURI)) {
                return true;
            //๊ด€๋ฆฌ์ž์ด์ง€๋งŒ ์ ‘๊ทผํ•  ์ˆ˜ ์—†๋Š” ๋ฉ”๋‰ด
            } else {
                log.info("๊ถŒํ•œ์€ ์žˆ์œผ๋‚˜ ๋ฉ”๋‰ด ์ ‘๊ทผ ๊ถŒํ•œ์ด ์—†์Šต๋‹ˆ๋‹ค.");
                response.sendRedirect("/"); // ๋˜๋Š” ๋‹ค๋ฅธ ์ ‘๊ทผ ๊ฑฐ๋ถ€ ํŽ˜์ด์ง€๋กœ ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ
                return false;
            }
        /*****๊ด€๋ฆฌ์ž๊ฐ€ ์•„๋‹Œ ๊ฒฝ์šฐ****************************/
        } 
        log.info("๊ด€๋ฆฌ์ž๋งŒ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ๋ฉ”๋‰ด์ž…๋‹ˆ๋‹ค.");
        response.sendRedirect("/"); // ๋˜๋Š” ๋‹ค๋ฅธ ์ ‘๊ทผ ๊ฑฐ๋ถ€ ํŽ˜์ด์ง€๋กœ ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ
        return false;
    }

    /**
     * ๋ฉ”๋‰ด์ ‘๊ทผ์— ํ•„์š”ํ•œ ์ตœ์†Œ ๋ ˆ๋ฒจ ์ฒดํฌ
     * @param requestURI
     * @return
     */
    private String getMenuRequiredAuthLevel(String requestURI) {

        String authLevel = "";
        //์‹œ์Šคํ…œ ๋ฉ”๋‰ด
        if (requestURI.startsWith("/cmmn/")) {
            authLevel = "2";
        //์—ฐ์ฐจ๋ฉ”๋‰ด
        } else if (requestURI.startsWith("/annual/")) {
            authLevel = "1";
        //๊ทธ ์™ธ
        } else {
            authLevel = "2";
        }
        return authLevel;
    }

    /**
     * ์‚ฌ์šฉ์ž์˜ ๋ฉ”๋‰ด์ ‘๊ทผ ๊ถŒํ•œ ์ฒดํฌ
     * @param empId
     * @param requestURI
     * @return
     */
    private boolean userHasMenuAccess(String empId, String requestURI) {
        //์‚ฌ์šฉ์ž์™€ ๋งคํ•‘๋œ ๋ฉ”๋‰ด ๋ชฉ๋ก ์กฐํšŒ
        List<MenuVo> menuList = cmmnMapper.selectUserMenuCodes(empId);

        if (menuList != null && menuList.size() > 0) {
            //์ ‘๊ทผํ•˜๋ ค๋Š” ๋ฉ”๋‰ด๊ฐ€ ์‚ฌ์šฉ์ž์™€ ๋งคํ•‘๋œ ๋ฉ”๋‰ด์— ์žˆ๋Š” ๊ฒฝ์šฐ
            for (MenuVo menuVo : menuList) {
                if (requestURI.contains(menuVo.getMenuUrl())) {
                    return true;
                }
            }
        }
        return false;
    }
}

ํ˜„์žฌ ๋ชจ๋“œ ๋ฉ”๋‰ด๋Š” ๊ด€๋ฆฌ์ž ์ด์ƒ๋งŒ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ์ƒํƒœ์ด๋‹ค.

์„ธ์…˜์—์„œ ๊ถŒํ•œ๋ ˆ๋ฒจ์„ ๊ฐ€์ ธ์™€ ๋กœ๊ทธ์ธํ•œ ์‚ฌ์šฉ์ž๊ฐ€ ๊ด€๋ฆฌ์ž์ธ์ง€ ์ฒดํฌํ•œ๋‹ค.

๊ด€๋ฆฌ์ž๋”๋ผ๋„ ๋ณธ์ธ๊ณผ ๋งคํ•‘๋œ ๋ฉ”๋‰ด๊ฐ€ ์•„๋‹ˆ๋ฉด ์ ‘๊ทผํ•  ์ˆ˜ ์—†๊ธฐ์— ํ˜„์žฌ ์ ‘๊ทผํ•˜๋ ค๋Š” ๋ฉ”๋‰ด๊ฐ€ ๋ณธ์ธ์˜ ์•„์ด๋””์™€ ๋งคํ•‘๋œ ๊ฒฝ์šฐ์—๋งŒ ํ†ต๊ณผ์‹œํ‚ค๋Š” ๋กœ์ง์ด๋‹ค.

๊ฐœ์ธ ์Šคํ„ฐ๋”” ๊ธฐ๋ก์„ ๋ฉ”๋ชจํ•˜๋Š” ๊ณต๊ฐ„์ด๋ผ ํ‹€๋ฆฐ์ ์ด ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ‹€๋ฆฐ ์  ์žˆ์„ ๊ฒฝ์šฐ ๋Œ“๊ธ€ ๋ถ€ํƒ๋“œ๋ฆฝ๋‹ˆ๋‹ค.

๋Œ“๊ธ€