관련 포스팅 :# Spring - 미니쇼핑몰 상품관리 구현해보기(상품목록, 상세보기)
관련 포스팅 :# Spring - 미니쇼핑몰 상품관리 구현해보기(장바구니 담기, 목록, 수정, 삭제)
관리자 권한으로 로그인하여 상품의 정보를 추가, 수정, 삭제할 수 있도록 관리자 영역을 추가하고, 외부 사용자가 관리자 영역을 접근할 수 없도록 인터셉터로 처리해보았다.
이전 포스팅과 마찬가지로 전에 구현했던 내용과 유사하기 때문에 새로 알게된 내용 위주로 정리해보자.
DB(Oracle)
1. 관리자 테이블 생성
관리자와 사용자를 구분하는 방법에는 여러가지 방법이 있겠지만 지금까지 구현해본 방법은 두가지 이다.
- 사용자 테이블에서 권한 칼럼을 추가하여 0이면 사용자, 1이면 관리자로 구별하는 방법
- 회원 테이블, 관리자 테이블을 따로 관리하는 법
두가지 방법중에 2번을 선택!
그 이유는 첫번째 방법으로 하려면 지금까지 작성한 코드를 많이 수정해야되기 때문에 관리자 테이블을 추가하는 방법으로 진행
View(JSP)
1. 관리자 로그인 페이지(adminLogin.jsp)
<form name="form1" method="post">
- 로그인의 경우에는 항상 post방식으로 값을 전송 (get방식은 보안에 취약)
<c:if test="${msg == 'failure'}"></c:if>
- 컨트롤러로부터 리턴받은 문자열이
failure
이면 “아이디,비밀번호가 일치하지 않습니다.”라는 메시지를 출력
<c:if test="${msg == 'logout'}">
- 로그아웃 처리후 컨트롤러로부터 리턴받은 문자열이
logout
이면 “로그아웃되었습니다”라는 메시지 출력
2. 상단메뉴 및 관리자 메인페이지(menu.jsp, adminHome.jsp)
일반 사용자 로그인 상태 및 일반 메인페이지
관리자 권한 로그인 상태 및 관리자 메인페이지
상단메뉴(menu.jsp)
<c:if test="${sessionScope.adminId != null }">
- session에 저장된 ID가 관리자ID이면 상품등록 메뉴 출력
관리자 메인페이지(adminHome.jsp)
<c:if test="${msg == 'success'}">
컨트롤러로부터 리턴받은 문자열이success
이면 관리자명과 관리자ID를 출력
Controller(흐름제어)
1. AdminController - 관리자 관련 컨트롤러
@RequestMapping("login.do")
: 관리자 로그인 페이지 매핑
- 로그인 페이지로 포워드
@RequestMapping("loginCheck.do")
- 관리자 로그인 성공하면 관리자 메인페이지로 포워딩하고,
success
문자열을 리턴- 로그인 실패하면 로그인 페이지로 포워딩하고,
failure
문자열을 리턴
@RequestMapping("logout.do")
session.invalidate()
로그아웃 처리후 로그인 페이지로 포워딩하고,logout
문자열을 리턴
Service(비지니스 로직, DB연동 이외의 핵심업무 처리)
1. AdminServiceImpl(AdminService인터페이스를 구현한 클래스)
loginCheck(MemberVO vo)
: adminDao의 로그인체크 메서드 호출
DAO(비지니스 로직, DB연동 작업처리)
1. AdminDAOImpl(AdminDAO인터페이스를 구현한 클래스)
loginCheck(MemberVO vo) : 관리자 테이블을 select조회한 결과를 리턴
MybatisMapper
1. 관리자 관련 mapper(adminMapper.xml)
loginCheck
: 관리자 테이블에서 관리자이름(userName)을 select조회, WHERE조건 id, pw
관리자 영역 설정하기(Interceptor)
관리자 인증이 필요한 페이지는 관리자 이외의 외부 사용자는 접근하지 못하도록 interceptor를 이용하여 로그인페이지로 리다이렉트시킨다.
즉, 다시 말하자면 상품 등록, 수정, 삭제처리를 관리자 이외의 다른 사람이 요청할 수 없도록 처리하였다.
AdminInterceptor의 흐름은 위의 흐름과 같다.
- preHandle() —> return true —> write.do —> postHandle()
- preHandle() —> return false —> login.do
1. Interceptor설정
servlet-context.xml
2. AdminInterceptor클래스
response.sendRedirect(request.getContextPath()+"/member/login.do?msg=nologin");
- session에 관리자id가 null일 경우, 일반사용자 로그인화면으로 리다이렉트하고, false를 리턴
- null이 아닐 경우는 true를 리턴
3. 구현화면
관리자 영역 설정 전
관리자 영역을 인터셉터로 설정안했을 경우, 미인증된 사용자가 상품등록 페이지 요청을 하면 그대로 요청이 실행된다.
관리자 영역 설정 후
관리자 영역을 인터셉터로 설정했을 경우, 미인증된 사용자가 상품등록 페이지 요청을 하면 로그인페이지로 리다이렉트 시키게된다.