본문 바로가기
Spring/Spring 기초

계정 권한검사 2번째방법?

by 미눅스[멘토] 2023. 8. 18.
728x90

security-context.xml 전체코드

<?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:security="http://www.springframework.org/schema/security"
   xsi:schemaLocation="http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security.xsd
   http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<!-- xmlns:security는 스프링 시큐리티가 제공하는 XML 네임스페이스를 활성화 --> 
   <!-- 인가 (authorization) 불허
         bean : 객체 / class="우리가 만든 클래스 / id : 우리가 만든 클래스를 인스턴스화 하여 만든 객체면
    -->  
   <bean id="customAccessDenied"
   class="kr.or.ddit.security.CustomAccessDeniedHandler"></bean>
  
  <!-- 로그인 성공 처리
     로그인 성공 후 이력 로그를 기록(DB, 파일)과 같은 작업을 하고자 할 때 사용
       -->
     <bean id="customLoginSuccess"
   class="kr.or.ddit.security.CustomLoginSuccessHandler">
   </bean>
   
   <!-- 사용자가 정의한 비밀번호 암호화 처리기를 빈(객체)으로 등록 -->
   <bean id="customPasswordEncoder"
    class="kr.or.ddit.security.CustomNoOpPasswordEncoder"></bean>
  
  <!-- 스프링 시큐리티의 UserDatailsService를 구현한 클래스를 빈(객체)으로 등록 -->
    <bean id="customUserDetailsService"
    class="kr.or.ddit.security.CustomUserDetailsService"></bean>
  
   <security:http>
      <!-- 접근 제한 설정 : 시큐리티 설정을 통해서 특정 URI에 대한 접근을 제한할 수 있음 
      Role : 권한 / hasRole : 권한을 갖고있니?
      permitAll : 누구나 접근 가능
      
             스프링 시큐리티 에너테이션
       - 스프링 시큐리티는 에너테이션을 사용하여 필요한 설정을 추가할 수 있음
       - 
      -->
<!--       <security:intercept-url pattern="/freeboard/list" access="permitAll"/> -->
<!--       <security:intercept-url pattern="/freeboard/register" access="hasRole('ROLE_MEMBER')"/> -->
<!--       <security:intercept-url pattern="/notice/list" access="permitAll"/> -->
<!--       <security:intercept-url pattern="/notice/register" access="hasRole('ROLE_ADMIN')"/> -->
      
      <!-- 폼 기반 인증 기능 사용 -->
<!--       <security:form-login/> -->
<!-- 사용자가 정의한 로그인(인증 : authentication) 페이지의 URI를 지정 -->
<!--        <security:form-login login-page="/member/loginMember"/> -->
       <!-- 인증 성공 시 처리해줄 클래스의 인스턴스 명 작성 -->
       <security:form-login login-page="/member/loginMember"
        authentication-success-handler-ref="customLoginSuccess"/>
       
       
       <!-- <sec:csrfInput/> 생략가능 -->
       <security:csrf disabled="true"/>
      
      <!-- 1. 접근 거부 처리(사용자 정의)
         접근 거부가 발생한 상황에 단순 메시지 처리 이상의 다양한 처리를 하고 싶다면
         AccessDeniedHandler를 직접 구현해야 함 
         -->
      <security:access-denied-handler ref="customAccessDenied"/>
      
      <!-- 자동 로그인
      	로그인하면 특정 시간 동안 로그인 할 필요가 없는 기능,
	    dataSource(root-context.xml)를 통해 지정한 데이터베이스의 약속된 테이블(PERSISTENT_LOGINS)을
	         이용하여 기존 로그인 정보를 기록함  	
	         
	    token-validity-seconds : 쿠키의 유효시간(초). 604800초는 7일
       -->
      <security:remember-me data-source-ref="dataSource"
       token-validity-seconds="604800"
      />
      
      <!--
      1. 접근 거부 처리(시큐리티 제공) 
      1) 선제조건 : 계정 / 비밀번호가 맞아야 함 -> 로그인 가능
      2) 들어가려는 URL에 대한 권한이 없어야 함
      /notice/register 요청에 member / java로 로그인 한 경우[ROLE_MEMBER]
       -->      
<!-- <security:access-denied-handler error-page="/security/accessError" /> -->
    <!-- 로그아웃 처리. 로그아웃 후에 세션을 무효화 함-->
    <security:logout logout-url="/logout" invalidate-session="true"
    delete-cookies="remember-me,JSESSION_ID" />
   </security:http>
   
   <!--
      authentication: 인증(로그인)
      authorization: 인가(로그인 후의 권한)
     authorities: 권한들
       로그인 처리.
       메모리상에 아이디와 패스워드를 지정하고 로그인을 처리함
       스프링 시큐리티(5.0.7.RELEASE버전) 5버전부터는 패스워트 암호화 처리기를 반드시 이용해야 함
       암호화 처리기를 사용하지 않으려면 noop 문자열을 비밀번호 앞에 사용함 
   -->
   <security:authentication-manager>
         <security:authentication-provider user-service-ref="customUserDetailsService">
         <!-- DB 사용을 위해 dataSource(root-context.xml)를 지정함
         <security:jdbc-user-service data-source-ref="dataSource"/> -->
      <!-- 
      users-by-username-query : 인증할 때 사용될 쿼리
      authorities-by-username-query : 권한을 확인할 때 사용될 쿼리
       -->
<!--       <security:jdbc-user-service data-source-ref="dataSource" -->
<!--       users-by-username-query="SELECT USER_NO, USER_PW, ENABLED FROM MEMBER2 WHERE USER_NO = ?" -->
<!--          authorities-by-username-query="SELECT A.USER_ID,B.AUTH  -->
<!--       FROM MEMBER2 A, MEMBER2_AUTH B -->
<!--       WHERE A.USER_NO = B.USER_NO -->
<!--       AND A.USER_NO = ? "/> -->
         <!-- 사용자가 정의한 비밀번호 암호화 처리기를 지정함 -->
         <security:password-encoder ref="customPasswordEncoder"/>

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

 

<!--       <security:intercept-url pattern="/freeboard/list" access="permitAll"/> -->
<!--       <security:intercept-url pattern="/freeboard/register" access="hasRole('ROLE_MEMBER')"/> -->
<!--       <security:intercept-url pattern="/notice/list" access="permitAll"/> -->
<!--       <security:intercept-url pattern="/notice/register" access="hasRole('ROLE_ADMIN')"/> -->

 

이부분 주석

 

 

 

 

servelet-context에

xmlns:security="http://www.springframework.org/schema/security" 추가

 

xsi:schemaLocation에도

http://www.springframework.org/schema/security https://www.springframework.org/schema/security/spring-security-4.2.xsd

추가해준다

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

 

 

 

 밑에다 이것도 추가

	<!-- 스프링 시큐리티 에너테이션을 활성화
	-pre-post-annotations="enabled" => 골뱅이PreAuthorize, 골뱅밍 PostAuthorize활성화
   	 ***골뱅이 PreAuthorize : 특정 메소드를 실행하기 전에 role(권한) 체킹
   	         골뱅이PostAuthorize : 특정 메소드를 실행한 후에 role(권한) 체킹
   	-secured-annotations="enabled" => 골뱅이 Security를 활성화
   	 Secured : 스프링 시큐리티 모듈을 지원하기 위한 에너테이션
	 -->
	<security:global-method-security pre-post-annotations="enabled"
		secured-annotations="enabled" />

 

 

 

 

이건 전체코드

<?xml version="1.0" encoding="UTF-8"?>
<beans:beans xmlns="http://www.springframework.org/schema/mvc"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:beans="http://www.springframework.org/schema/beans"
	xmlns:context="http://www.springframework.org/schema/context"
	xmlns:security="http://www.springframework.org/schema/security"
	xsi:schemaLocation="http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd
		http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd
		http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd
		http://www.springframework.org/schema/security https://www.springframework.org/schema/security/spring-security-4.2.xsd
		">
	<!-- servlet-context.xml : 스프링 웹(view) 설정 파일 
	뷰(JSP 웹 페이지)와 관련 있는 빈(bean) 객체를 설정함. 즉, 컨트롤러, MultipartResolver, Intercepter, URI와
		관련 설정을 담는 클래스를 설정함
	
	골뱅이Controller, 골뱅이RequestMapping과 같은 애너테이션을 사용 시 필요한 빈(bean) 객체들을 자동으로 등록함
	핸들러 어댑터의 빈(bean) 객체도 대신 등록함
	 -->
	<!-- DispatcherServlet Context: defines this servlet's request-processing infrastructure -->
	
	<!-- Enables the Spring MVC @Controller programming model -->
	<annotation-driven />

	<!-- Handles HTTP GET requests for /resources/** by efficiently serving up static resources in the ${webappRoot}/resources directory -->
	<!-- static folder설정(정적 폴더 설정)=> css, images, upload, js
	서버에서 앞서 처리될 필요가 없는 정적 리소스 파일을 처리하는 역할 수행
	웹 애플리케이션의 물리적 경로 이름을 설정하고 이 경로에 정적 리소스 파일들을 저장하면
	소스 코드나 웹 브라우저의 주소창에서 해당 리소스의 경로를 사용하여 직접 접속할 수 있음
	정적 리소스란 클라이언트에서 요청이 들어왔을 때 요청 리소스가 이미 만들어져 있어 그대로 응답하는 것
	mapping : 웹 요청 경로 패턴을 설정. 컨텍스트 경로를 제외한 나머지 부분의 경로와 매핑
	location : 웹 애플리케이션 내에서 실제 요청 경로의 패턴에 해당하는 자원 위치를 설정, 위치가 여러 곳이면 각 위치를 쉼표로 구분
	 -->
	<resources mapping="/resources/**" location="/resources/" />
	
	<!-- Resolves views selected for rendering by @Controllers to .jsp resources in the /WEB-INF/views directory -->
	<!-- setOrder("2") => tiles를 작동한 후에 ViewResolver를 작동하겠다라는 의미 -->
	<beans:bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
		<beans:property name="prefix" value="/WEB-INF/views/" />
		<beans:property name="suffix" value=".jsp" />
		<beans:property name="order" value="2" />
	</beans:bean>
	
	<!-- Tiles 설정 시작 -->
	<beans:bean id="tilesConfigurer"
		class="org.springframework.web.servlet.view.tiles3.TilesConfigurer">
		<beans:property name="definitions">
			<beans:list>
				<beans:value>/WEB-INF/spring/tiles-config.xml</beans:value>
			</beans:list>
		</beans:property>
	</beans:bean>
	<!-- UrlBasedViewResolver tilesViewResolver = new UrlBasedViewResolver() -->
	<beans:bean id="tilesViewResolver"
		class="org.springframework.web.servlet.view.UrlBasedViewResolver">
		<beans:property name="viewClass"
			value="org.springframework.web.servlet.view.tiles3.TilesView" />
		<beans:property name="order" value="1" />
	</beans:bean>
	<!-- Tiles 설정 끝 -->
	
	<!-- 스프링 시큐리티 에너테이션을 활성화
	-pre-post-annotations="enabled" => 골뱅이PreAuthorize, 골뱅밍 PostAuthorize활성화
   	 ***골뱅이 PreAuthorize : 특정 메소드를 실행하기 전에 role(권한) 체킹
   	         골뱅이PostAuthorize : 특정 메소드를 실행한 후에 role(권한) 체킹
   	-secured-annotations="enabled" => 골뱅이 Security를 활성화
   	 Secured : 스프링 시큐리티 모듈을 지원하기 위한 에너테이션
	 -->
	<security:global-method-security pre-post-annotations="enabled"
		secured-annotations="enabled" />
	<!-- kr.or.ddit 패키지를 컴포넌트 스캔 대상으로 함
	
	 -->
	<context:component-scan base-package="kr.or.ddit" />
	
	
	
</beans:beans>

 

 

 

시큐리티 컨트롤러에 주석달아줌

	//요청URI : /freeboard/register
	//회원게시판의 등록
	//로그인한 회원 중에서 ROLE_ADMIN 또는 ROLE_MEMBER 권한을 갖는 경우 접근 가능
	//골뱅이PreAuthorize("hasRole('ROLE_ADMIN','ROLE_MEMBER')")
	//골뱅이Secured({"ROLE_ADMIN","ROLE_MEMBER"})
	@PreAuthorize("hasRole('ROLE_MEMBER') or hasRole('ROLE_ADMIN')")
	@GetMapping("/freeboard/register")
	public String freeboardRegister() {
		
		//forwarding
		return "freeboard/register";
	}
    
    //요청URI : /notice/list
	//공지사항 게시판의 목록
	//누구나 접근 가능 -> ROLE_MEMBER 권한 또는 ROLE_ADMIN 권한에 상관없이 로그인 한 경우만 접근 가능
	@PreAuthorize("isAuthenticated()")
	@GetMapping("/notice/list")
	public String noticeList() {
		//forwarding
		return "notice/list";
	}
	
	//요청URI : /notice/register
	//공지사항 게시판의 등록
	//로그인한 관리자만 접근 가능
	@PreAuthorize("hasRole('ROLE_ADMIN')")
	@GetMapping("/notice/register")
	public String noticeRegister() {
		//forwarding
		return "notice/register";
	}

'Spring > Spring 기초' 카테고리의 다른 글

SVN설치방법  (0) 2023.08.22
e7e샘의 초간단 웹소켓  (0) 2023.08.18
시큐리티 자동로그인 구현  (0) 2023.08.18
스프링 시큐리티 표현식  (0) 2023.08.18
Security 폼 기반 인증 기능 사용(로그아웃 처리)  (0) 2023.08.17