- 인터셉터(Interceptor)로 관리자, 일반회원 구분 기능
인터셉터는 Filter보다 더 넓은 범위의 일종의 제어 장치라고 볼 수 있는데, 그 이유는 Filter와는 다르게 원하는 위치에 자유롭게 인터셉터를 걸 수 있기 때문이다. 이러한 인터셉터 기능을 통해 홈페이지에서 로그인 시 관리자와 일반회원을 구분하여 관리자일 때, 일반회원일 때 홈페이지에 접근할 수 있는 권한을 다르게 부여해줄 수 있다. 순서는 다음과 같다.
1) InterceptorConfig 클래스를 생성하여 인터셉터 기능을 넣어준다. 이 때, InterceptorConfig는 반드시 WebMvcConfigurer를 상속 혹은 확장하여 사용한다.
@Configuration
public class InterceptorConfig implements WebMvcConfigurer{
@Autowired
private NoticeInterceptor noticeInterceptor;
@Autowired
private QnaInterceptor qnaInterceptor;
@Override
public void addInterceptors(InterceptorRegistry registry) {
// 공지사항 게시판 - 관리자만 작성 가능
registry.addInterceptor(noticeInterceptor)
.addPathPatterns("/notice/*")
.excludePathPatterns("/notice/list")
.excludePathPatterns("/notice/select");
// 모든 게시판 - 회원만 작성 가능
registry.addInterceptor(qnaInterceptor)
.addPathPatterns("/qna/*")
.excludePathPatterns("/qna/list");
}
Notice게시판과 Qna게시판에 각각 인터셉터를 걸어주는데, 이를 위해 먼저 객체를 주입해준다. 그리고 오버라이딩하여 인터셉터를 추가하는 메서드를 구현해주는데, 여기서는 Notice게시판과 Qna게시판의 접근 권한을 각각 다르게 설정해주었다.
Notice게시판에서는 리스트보기(list)와 글을 선택하여 내용을 확인할 수 있는 셀렉트(select)는 모두 접근이 가능하도록 패턴에서 제외(exclude)해주되, 나머지는 관리자만 접근가능하도록 추후 추가해줄 것이다. Qna게시판에서는 마찬가지로 리스트보기(list)는 모두 접근이 가능하도록 패턴에서 제외(exclude)하지만, 나머지 권한은 로그인이 된 회원만 가능하도록 추후 추가해줄 것이다.
2) 인터셉터를 걸어줄 각각의 게시판에 대해 개별적으로 인터셉터 클래스를 생성한다.
@Component
public class NoticeInterceptor implements HandlerInterceptor{
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
HttpSession session = request.getSession();
MemberVO memberVO = (MemberVO)session.getAttribute("member");
// 로그인 안됨
if(memberVO == null) {
response.sendRedirect("/member/login");
return false;
// 로그인 되었으나 관리자가 아님
}else if(memberVO.getRole().equals("2")){
request.setAttribute("message", "접근권한이 없습니다.");
request.setAttribute("path", "/notice/list");
RequestDispatcher view = request.getRequestDispatcher("/WEB-INF/views/common/adminAccess.jsp");
view.forward(request, response);
return false;
//관리자 확인됨
}else {
return true;
}
}
}
Notice게시판의 경우, 경우의 수가 3가지인지라 위와 같이 구성하였다. 세션으로 얻어오는 memberVO 객체의 경우, MemberController에서 로그인 완료 후 session에 미리 memberVO으로 로그인 정보를 저장해둔 것을 가져온 것이다.
1) 이것이 null 값이면 로그인이 안 된 것이므로 로그인창으로 보낸다.
2) 이 값에서 role(숫자(타입 int)로 관리자인지 일반회원인지를 판별할 수 있도록 DB에서 미리 설정해두었다)을 가져와 2번(일반회원)임이 판별되면 관리자가 아니므로 권한이 없다는 메세지와 함께 다시 list 화면으로 보낸다. 이 때, list 화면으로 가기 이전에 메세지를 확인하고 갈 수 있도록 adminAccess.jsp를 따로 생성해주었다. 이곳에서 js 코드를 통해 alert 창으로 해당 메세지를 확인하고 바로 list 화면으로 넘어간다.
3) 마지막으로 위 둘의 경우 중 어디에도 해당이 되지 않는다면 남은 경우의 수는 1가지 즉, 관리자인 것이므로 계속 진행하도록 리턴값으로 true를 보낸다.
@Component
public class QnaInterceptor implements HandlerInterceptor{
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
HttpSession session = request.getSession();
MemberVO memberVO = (MemberVO)session.getAttribute("member");
//로그인 안됨
if(memberVO == null) {
request.setAttribute("message", "등록된 회원이 아닙니다.");
request.setAttribute("path", "/member/login");
RequestDispatcher view = request.getRequestDispatcher("/WEB-INF/views/common/memberAccess.jsp");
view.forward(request, response);
return false;
//로그인 되어있음
}else {
return true;
}
}
}
Qna게시판은 두 가지로 구분하였다.
1) 가져온 값이 null이면 Notice게시판에서와 마찬가지로 로그인 화면으로 보내는데, 이 때 memberAccess.jsp로 보내 먼저 alert창을 통해 등록된 회원이 아님임을 알리는 메세지를 확인하고 갈 수 있도록 한다.
2) 위의 경우가 아니라면 로그인이 된 상태인 것이므로 계속 진행할 수 있도록 리턴값으로 true를 보낸다.
p.s.
위 기능 구현차 인터셉터 관련 자료들을 검색해보니, 대부분 관리자인지 아닌지의 경우만 가지고 만든 자료들이 대부분이어서 자료를 참고해 위처럼 3가지 경우의 수가 있는 경우를 만들어주었다.
'TIL' 카테고리의 다른 글
<자바스크립트 Javascript> 선택지 만들기(심리테스트 알고리즘 이용) (2) (0) | 2021.12.03 |
---|---|
<자바스크립트 Javascript> 선택지 만들기(심리테스트 알고리즘 이용) (1) (0) | 2021.12.02 |
<스프링 부트 Spring boot> 게시판 구현 - 답글 기능 (0) | 2021.11.30 |
<스프링 Spring> 페이징 + 검색 기능 구현 (0) | 2021.11.29 |
<스프링 부트 Spring boot> 게시판 구현 - 글 목록 조회 (0) | 2021.11.28 |