본문 바로가기
SpringBoot

Spring-Boot Blog Project 5. 권한, 인증 체크하기

by 김마리님 2020. 7. 27.

이전 게시물 여기 >>

Spring-Boot Blog Project 4. 로그인 화면 구현하기

 

Spring-Boot Blog Project 4. 로그인 화면 구현하기

이전 글 Spring-Boot Blog Project 3. 회원가입 화면 구현하기 Spring-Boot Blog Project 3. 회원가입 화면 구현하기 Spring-Boot Blog Project 2. nav, footer 제작 Spring-Boot Blog Project 2. nav, footer 제..

itstudy-mary.tistory.com

 

인터셉터와 컨트롤러를 이용해서 권한과 인증을 체크한다. 

 

인터셉터가 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{

}
반응형