이전 게시물 여기 >>
Spring-Boot Blog Project 4. 로그인 화면 구현하기
인터셉터와 컨트롤러를 이용해서 권한과 인증을 체크한다.
인터셉터가 preHandler 속성을 이용해 컨트롤러가 발효되기 전에 작동한다. 여기서 결과값이 true일 경우 컨트롤러로 진입, false 일 경우 컨트롤러 실행이 중지된다.
(postHandler 일 경우에는 컨트롤러 수행 후 view가 뜨기 전 실행된다.
RoleIntercepter.java
package com.mary.blog.config.aop;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
import com.mary.blog.config.handler.MyRoleException;
import com.mary.blog.config.handler.MySessionException;
import com.mary.blog.model.User;
//권한 관리
public class RoleIntercepter extends HandlerInterceptorAdapter{
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
HttpSession session = request.getSession();
User principal = (User)session.getAttribute("principal");
if(principal == null) {
System.out.println("RoleIntercepter : 인증이 안됨");
throw new MySessionException(); // Exception을 던진다.
}else{
if(!principal.getRole().equals("ROLE_ADMIN")) {
System.out.println("RoleIntercepter : 권한이 없음");
throw new MyRoleException();
}
}
return true;
}
}
SessionIntercepter.java
package com.mary.blog.config.aop;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
import com.mary.blog.config.handler.MyRoleException;
import com.mary.blog.config.handler.MySessionException;
import com.mary.blog.model.User;
//권한 관리
public class RoleIntercepter extends HandlerInterceptorAdapter{
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
HttpSession session = request.getSession();
User principal = (User)session.getAttribute("principal");
if(principal == null) {
System.out.println("RoleIntercepter : 인증이 안됨");
throw new MySessionException(); // Exception을 던진다.
}else{
if(!principal.getRole().equals("ROLE_ADMIN")) {
System.out.println("RoleIntercepter : 권한이 없음");
throw new MyRoleException();
}
}
return true;
}
}
인터셉터에서 true를 반환받으면 컨트롤러를 수행하지만, false면 컨트롤러 수행이 중지되고 exception으로 오류가 핸들링된다.
(throw new ~Exception)
이 오류들은 GlobalHandler에서 다시 낚아채서 결과를 리턴할 수 있다.
GlobalExceptionHandler.java
package com.mary.blog.config.handler;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestController;
@ControllerAdvice // IOC 등록됨. Exception 을 낚아 채는 컨트롤러
@RestController
public class GlobalExceptionHandler {
@ExceptionHandler(value=MySessionException.class)
public String sessionException(Exception e) {
// 인증 안됨.
return "<h1>인증 없어요 나가세요</h1>";
}
@ExceptionHandler(value=MyRoleException.class)
public String roleException(Exception e) {
// 권한 없음.
return "<h1>권한 없어요 나가세요</h1>";
}
}
MyRoleException.java
package com.mary.blog.config.handler;
public class MyRoleException extends Exception{
}
MySessionException.java
package com.mary.blog.config.handler;
public class MySessionException extends Exception{
}
반응형
'SpringBoot' 카테고리의 다른 글
Spring-Boot Blog Project 7. 글쓰기 구현하기 (0) | 2020.07.27 |
---|---|
Spring-Boot Blog Project 6. 로그아웃 구현하기 (0) | 2020.07.27 |
Spring-Boot Blog Project 4. 로그인 화면 구현하기 (0) | 2020.07.20 |
Spring-Boot Blog Project 3. 회원가입 화면 구현하기 (0) | 2020.07.20 |
Spring-Boot Blog Project 2. nav, footer 제작 (0) | 2020.07.20 |