JAVAIARY

Spring Security - 2. 로그인 처리 본문

lectureNote/SPRING

Spring Security - 2. 로그인 처리

shiherlis 2022. 12. 16. 09:47

0. 기본 페이지 생성

 

SampleController 생성

@Log4j
@RequestMapping("/sample/*") 
@Controller
public class SampleController {

	@GetMapping("/all")
	public void doAll() {
		
		log.info("do all can access everybody");
	}
	
	@GetMapping("/member")
	public void doMember() {
		log.info("logined member");
	}
	
	@GetMapping("/admin")
	public void doAdmin() {
		log.info("admin only");
	}
}

sample 폴더 아래 뷰 생성

 


1. 접근 제한 설정

 security-context.xml

	<security:http>
		<security:intercept-url pattern="/sample/all" access="permitAll"/>
	    <security:intercept-url pattern="/sample/member" access="hasRole('ROLE_MEMBER')"/>
	<security:form-login />
  </security:http>
  <security:authentication-manager>
  </security:authentication-manager>
	
	

</beans>
  • <security:intercept-url />
  • <security:intercept-url pattern="/sample/member" access="hasRole('ROLE_MEMBER')"/>
  • pattern : uri 패턴
  • access : 권한 체크
  • /sample/member URI 는 'ROLE_MEMBER'라는 권한이 있는 사용자만 접근 가능

  • 권한이 없는 상태로  sample/member URI로 접속을 시도 하게 되면
  • /login 으로 강제 이동됨 ( 스프링 시큐리티에서 기본제공해주는 로그인 폼)

2. 단순 로그인 처리

  1) 로그인 확인을 위한 추가 설정

security-context.xml

<security:authentication-manager>
	  <security:authentication-provider>
	      <security:user-service>
	        
	        <security:user name="member" password="{noop}member" authorities="ROLE_MEMBER"/>
	
	      
	      </security:user-service>
	    
	    </security:authentication-provider>
  </security:authentication-manager>

security-context.xml

  •  member라는 계정정보를 가진 사용자가 로그인을 할 수 있도록 하는 것

 ※ 주의사항 : 시큐리티에서는 username을 일반적인 id의 의미로 사용함. 혼동하지 않도록 주의할 것

id : member&nbsp; pw : member

  • {noop} 없이 해당 정보로 로그인 시도시에는 PasswordEncoder가 없기 때문에  오류 발생
  • id : member  pw : member 로 로그인시  member page로 정상이동

로그아웃 처리는 추후에 작성. 세션 삭제로 로그아웃이 정상적으로 작동하는지만 확인

 2) admin 권한 사용자 설정

<security:user name="admin" password="{noop}admin" authorities="ROLE_MEMBER, ROLE_ADMIN"/>
  • admin 계정을 가진 사용자에게는 ROLE_MEMBER와 ROLE_ADMIN 권한 2개를 모두 주어 모든 페이지에 접속이 가능하도록 한다.

admin 계정으로 로그인해야만 접속할 수 있는 페이지

  • id: admin pw: admin 계정으로 접속하면 admin page와 member page에 접속이 가능한 것을 확인할 수 있음

 2) 접근 제한 메시지 처리

member 계정으로 admin page 접속 시도시

  • 당연하게도 member계정으로는 admin page에 접속할 수 없음
  • AccessDeniedHandler를 구현하거나 URI 지정으로 처리할 수 있음

 2-1) URI 지정을 통한 처리

<!-- 접근 거부 처리 -->
<security:access-denied-handler error-page="/accessError"/>
  • /accessError 라는 URI로 접근제한시 보이는 화면 처리

CommonController 생성

 

@Log4j
@Controller
public class CommonController {

	@GetMapping("/accessError")
	public void accessDenied(Authentication auth, Model model) {
		log.info("access Denied :" + auth);
		model.addAttribute("msg", "접근 거부됨");
	}
}

/accesError 접근시 보여줄accesError 뷰생성

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>

<body>
  	<h1>Access Denied Page</h1>
  
  	<h2><c:out value="${SPRING_SECURITY_403_EXCEPTION.getMessage()}"/></h2>
 
	<h2><c:out value="${msg}"/></h2>
	  
  </body>
  • HttpServletRequest에 SPRING_SECURITY_403_EXCEPTION 라는 이름으로 AccessDeniedException객체 전달

  • accessError 페이지로 보내지지만 URI는 접속한 URI 그대로임

 2-2) AccessDeniedHandler (인터페이스) 구현을 통한 처리

  • 다양한 처리 가능
  • ex) 접근 제한시 쿠키or세션에 특정 작업하기/ HttpServletResponse에 특정 헤더 정보 추가 등

security 패키지와CustomAccessDeniedHandler 클래스 추가

@Log4j
public class CustomAccessDeniedHandler implements AccessDeniedHandler{

	public void handle(HttpServletRequest request, HttpServletResponse response,
			AccessDeniedException accessDeniedException) throws IOException, ServletException {
		
		log.info("Access Denied Handler");
		
		log.error("Redirect....");
		
		response.sendRedirect("/springsecurity/accessError");
		
		
	}

}
  • AccessDeniedHandler인터페이스를 구현 해준다.
  • 위에서는 redirect하는 방식으로 동작하도록 설계
  • customAccessDenied로 동작하도록 등록

/domain/accessError URI로 이동

  • member/member 계정으로 sample/admin 에 접근했을 때 springsecurity/accessError 로 강제 이동됨

 


# 코드로 배우는 웹 프로젝트 참고