프로젝트

프로젝트 마이그레이션 작업중 ( 권한에 따른 접근제한)

동곤일상 2025. 6. 11. 16:27
반응형

우리프로젝트가

학생,교수별 접근제한이 확실히 이루어져야함

버튼만 숨겨놓는다고 해서 접근제한이 완벽하게 되지않음

(주소로 접근이 가능함)

 

그래서 그 문제를 해결해보고자

세션정보(loginId)에 따른 접근제한을 걸고자한다.

 

1) webConfig에서 interceptor 지정

2)  interceptor생성 (handler)

2-1) StuCheckInterceptor ( 학생인지 확인하는 곳 )

2-2)  proCheckInterceptor

3) alertController 생성

4) 테스트

 

 


1) webConfig에서 interceptor 지정

package com.ldb.lms.config;

@Configuration
public class WebConfig implements WebMvcConfigurer {

    @Override
    public void addInterceptors(InterceptorRegistry registry) {     
        //학생이 아니라면 false반환(학생만 접근가능)
        registry.addInterceptor(new StuCheckInterceptor())
        .addPathPatterns("/mypage/getCourseTimetable")
        .addPathPatterns("/learning_support/**")
        .addPathPatterns("/api/learning_support/**")
        .excludePathPatterns("/", "/login", "/css/**", "/js/**");
        
        //교수가 아니라면 false반환(교수만 접근가능)
        registry.addInterceptor(new ProCheckInterceptor())
        .addPathPatterns("/professors/**")
        .addPathPatterns("/notice/createNotice");
    }
}

webConfig를 등록해

특정URL(addPathPatterns에 추가한 주소)에 접근하게되면

해당 Interceptor가 실행됨

(true or false에 따라 동작이달라짐)


2) interceptor생성 (handler)

2-1) StuCheckInterceptor ( 학생인지 확인하는 곳 )

package com.ldb.lms.interceptor;
@Component
public class StuCheckInterceptor implements HandlerInterceptor{

	@Override
    public boolean preHandle(HttpServletRequest request,
                             HttpServletResponse response,
                             Object handler) throws Exception {
    	/*인자 false의 의미:
    	false를 전달하면, 기존 세션이 존재하지 않는 경우 새 세션을 생성하지 않고 null을 반환*/
       HttpSession session = request.getSession(false);        
       //세션null검증은 LogincheckInterceptor에서 진행하므로 굳이 로그인세션이 존재하는지 검증하지않는다
       
       String position = (String)session.getAttribute("login");
       if(!position.contains("S")) {    	   
    	   String msg = "학생만접근 가능합니다";
    	   
    	   //한국어메시지를get방식으로 그냥넘기려하면 문제가생김! URLEncoder를 이용해 UTF-8로 인코딩
    	   response.sendRedirect("/alert?"
    	   		+ "url=/"
    	   		+ "&"
    	   		+ "msg="+URLEncoder.encode(msg, StandardCharsets.UTF_8));
    	   return false;
       }
        return true; // 학생이라면 정상실행
    }
	

}

 

2-2) proCheckInterceptor

 ( 교수인지 확인하는 곳 )

package com.ldb.lms.interceptor;

@Component
public class ProCheckInterceptor implements HandlerInterceptor{

	@Override
    public boolean preHandle(HttpServletRequest request,
                             HttpServletResponse response,
                             Object handler) throws Exception {
    	/*인자 false의 의미:
    	false를 전달하면, 기존 세션이 존재하지 않는 경우 새 세션을 생성하지 않고 null을 반환*/
       HttpSession session = request.getSession(false);        
       //세션null검증은 LogincheckInterceptor에서 진행하므로 굳이 로그인세션이 존재하는지 검증하지않는다
       
       String position = (String)session.getAttribute("login");
       if(!position.contains("P")) {    	   
    	   String msg = "교수만 접근 가능합니다";
    	   
    	   //한국어메시지를get방식으로 그냥넘기려하면 문제가생김! URLEncoder를 이용해 UTF-8로 인코딩
    	   response.sendRedirect("/alert?"
    	   		+ "url=/"
    	   		+ "&"
    	   		+ "msg="+URLEncoder.encode(msg, StandardCharsets.UTF_8));
    	   return false;
       }
        return true; // 교수면 정상실행
    }
	

}

 

3) alertController 생성

package com.ldb.lms.controller;
@Controller
public class AlertController {

	@GetMapping("/alert")
	public String callAlert(@RequestParam("url") String url,
			@RequestParam("msg") String msg, Model model) {
		model.addAttribute("url", url);
		model.addAttribute("msg", msg);
		return "alert";
	}
}

alert페이지를 mapping하는 곳이 없어서 만들었다

/alert 이 매핑되면

파라미터값으로 넘어온 url ,msg값들을

model객체에 담아 alert페이지로 리턴시켜주는역할


4) 테스트

상황 :

학생이 교수지원 카테고리에 접근하려 하는 상황

알림창을 띄운 후 main페이지인  " / "  로 매핑