보안/Spring Security

[실습] 권한별로 접근 페이지 제어하기 - 일반적 방법

무적강사 2019. 9. 10. 01:39

다음과 같은 조건을 만족하도록 접근 권한을 설정하세요. security-config_ver3.xml로 SaveAs 하고 작업하세요.

 

[조건]

1. 로그아웃(/emp/logout.do)

인증한 사용자만 접근할 수 있어야 합니다. - ROLE_ADMIN, ROLE_USER

 

2. 게시글목록보기 (/board/list.do, /board/ajax_boardlist.do)

인증을 받거나 받지 않거나 모두 볼 수 있도록 설정

 -  ROLE_ADMIN, ROLE_USER, ROLE_ANONYMOUS

 

3. /emp/로 시작하는 모든 요청

관리자 권한을 갖고 있는 사용자만 접근할 수 있도록 설정하기 - ROLE_ADMIN

 

[풀이]

이제 앞으로 프로젝트의 모든 카테고리에 권한을 적용해야 합니다. path를 정의할 때도 일관성이 있어야 하며 같은 권한을 정의하는 경우 어떤 조건을 주고 path를 결정할지도 의견 조율을 해야 합니다.

우선 모든 카테고리에 인증된 사용자만 접근할 수 있어야 하는 path에는 두 번째 카테고리명에 /user/를 추가하도록 하겠습니다. 

게시판에 글을 등록하고 게시글을 읽는 것 부터는 인증된 사용자만 가능하도록 설정할 것입니다.

BoardController를 열고 글 등록의 value를 아래와 같이 /board/user/insert.do로 변경합니다.

 

글 읽기도 /board/user/read.do로 변경합니다. 업데이트나 delete는 글을 읽어야 실행할 수 있는 기능이므로 지금은 추가하지 않지만 혹시 다른 곳에서 다른 방식으로 호출될 수 도 있어야 하므로 제대로 추가해야 합니다.

 

글 등록 뷰를 실행하는 요청도 변경해야 합니다. 뷰만 청하는 것은 설정 파일에 등록하였으므로 /WEB-INF/config/view-config.xml을 실행합니다.

 

view-config.xml에서  글 등록 페이지를 요청하는 path도 /board/user/insertView.do로 변경합니다.

 

이 기능들을 요청하는 곳도 변경해야겠죠? 

먼저 /WEB-INF/board/boardlist.jsp를 열고 제목 클릭하여 상세보기를 보는 부분과 글쓰기 뷰를 보는 부분을 수정해야 합니다.

 

 

/WEB-INF/include/mainContent.jsp파일을 열고 ajax 요청할 때 보이는 페이지의 글 읽는 부분을 변경하도록 하겠습니다.

이제 각 요청 path별로 권한을 정의하도록 하겠습니다. 

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:mvc="http://www.springframework.org/schema/mvc"
	xmlns:security="http://www.springframework.org/schema/security"
	xsi:schemaLocation="http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-3.2.xsd
		http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.2.xsd
		http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

	<!-- role별로 접근할 수 있는 리소스를 정의하는 작업 -->
	<security:http pattern="/**/*.js" security="none"/>
	<security:http pattern="/**/*.css" security="none"/>
	<security:http pattern="/images/**" security="none"/>
	<security:http auto-config="true">
		<security:intercept-url pattern="/admin/**" access="ROLE_ADMIN"/>
		<security:intercept-url pattern="/emp/login" 
							access="ROLE_ANONYMOUS,ROLE_USER,ROLE_ADMIN"/>
		<security:intercept-url pattern="/emp/logout.do" 
							access="ROLE_USER,ROLE_ADMIN"/>
		<security:intercept-url pattern="/index.do" 
							access="ROLE_ANONYMOUS,ROLE_USER,ROLE_ADMIN"/>
		<security:intercept-url pattern="/**/user/**" 
							access="ROLE_USER,ROLE_ADMIN"/>					
		<security:intercept-url pattern="/board/*" access="ROLE_ANONYMOUS,ROLE_USER,ROLE_ADMIN"/>			
		<security:intercept-url pattern="/emp/*" access="ROLE_ADMIN"/>		
		<security:intercept-url pattern="/**" access="ROLE_USER,ROLE_ADMIN"/>
		<security:form-login
			username-parameter="id" 
			password-parameter="pass"
			login-page="/emp/login"
			default-target-url="/index.do"
			authentication-failure-url="/emp/login.do?fail=true"
		/>
		<security:logout
			delete-cookies="true"
			logout-success-url="/emp/login"
			logout-url="/emp/logout"
			invalidate-session="true"
		/>
	</security:http>
	<security:authentication-manager>
		<security:authentication-provider>
			<security:user-service>
				<security:user name="user" password="user"
					authorities="ROLE_USER" />
				<security:user name="admin" password="admin"
					authorities="ROLE_ADMIN" />
			</security:user-service>
		</security:authentication-provider>
	</security:authentication-manager>
</beans>

 

위의 설정파일에 등록된 내용과 동일하게 권한을 등록하면 됩니다. 그런데 중간에 처음 보는 표현법이 있죠? 

/**/user/**입니다.

/**/user/**의 pattern은 중간에 아무 곳에나 /user/가 포함된 모든 path에 대해서 권한을 적용하겠다는 의미입니다. 즉 /board/user/read.do, /board/notice/list.do모두 해당되는 pattern입니다.

 

만약 두 번째 카테고리에만 /user/가 포함된 path에 적용하고 싶다면 /** 대신에 /*로 재정의해야 합니다. /*/user/**은 두 번째 카테고리가 user인 모든 path에 권한을 적용하겠다는 의미입니다.

 

이해하셨으리라 생각됩니다. 잘 안되시거나 오류 나는 거 있으시면 질문 주시고요..^^