Notice
Recent Posts
Recent Comments
Link
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
Tags more
Archives
Today
Total
관리 메뉴

기록

JAVA Spring security 시큐리티 설정 본문

JAVA

JAVA Spring security 시큐리티 설정

9400 2023. 2. 13. 11:13

spring security 

인증(Authentication) : 로그인 (맨 처음 문) 

인가(Authorization) : 로그인 후 권한 / 특정 영역에 들어갈 수 있는 권한이 있는가?

 

로그인 폼

<form action="/login" method="post" >
	<input type="text" name="username" />
    <input type="text" name="userpass" />
    <input type="submit" />
   <sec: csrfInput />

USERS - username/userpass/enable 컬럼이 반드시 있어야함 

USER - 

 

xom.xml 추가(의존관계 추가)

1. maven에 spring-security-web 검색 -> 추가 

<!-- 스크링 시큐리티 라이브러리 의존관계 정의-->
<!-- 스크링 시큐리티를 웹에서 동작하도록 해줌 -->
<!-- https://mvnrepository.com/artifact/org.springframework.security/spring-security-web -->
    <dependency>
        <groupId>org.springframework.security</groupId>
        <artifactId>spring-security-web</artifactId>
        <version>5.0.7.RELEASE</version>
    </dependency>

2. spring-security-config 검색 -> 추가 

<!-- 스프링 시큐리티 설정을 도와줌 -->
<!-- https://mvnrepository.com/artifact/org.springframework.security/spring-security-config -->
    <dependency>
        <groupId>org.springframework.security</groupId>
        <artifactId>spring-security-config</artifactId>
        <version>5.0.7.RELEASE</version>
    </dependency>

3. spring-security-core 검색 -> 추가 

<!-- 스프링 시큐리티 일반 기능 추가  -->
<!-- https://mvnrepository.com/artifact/org.springframework.security/spring-security-core -->
    <dependency>
        <groupId>org.springframework.security</groupId>
        <artifactId>spring-security-core</artifactId>
        <version>5.0.7.RELEASE</version>
    </dependency>

 

4.spring security taglib 검색 -> 추가 

<!-- 스프링 시큐리티와 태그 라이브러리를 연결해줌 -->
<!-- https://mvnrepository.com/artifact/org.springframework.security/spring-security-taglibs -->
    <dependency>
    <groupId>org.springframework.security</groupId>
    <artifactId>spring-security-taglibs</artifactId>
    <version>5.0.7.RELEASE</version>
    </dependency>

 

 

web.xml 추가

 web.xml : tomcat 서버의 설정 

	<context-param>
		<param-name>contextConfigLocation</param-name>
		<param-value>/WEB-INF/spring/root-context.xml
			/WEB-INF/spring/security-context.xml</param-value>
	</context-param>
    
    
/WEB-INF/spring/security-context.xml   ->> 추가
	<!-- 서클릿 필터 클래스를 서블릿 컨테이너에 등록함 -->
	<filter>
		<filter-name>springSecurityFilterChain</filter-name>
		<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
	</filter>
	<filter-mapping>
		<filter-name>springSecurityFilterChain</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>

spring 폴더안에 secutiry-context.xml 추가 

 

 

secutiry-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">
 	
 	<!-- customAccessDenied를 자바빈(객체)으로 등록함/ 권한불일치시 다음의 클래스로 이동 -->
 	<bean id="customAccessDenied" class="kr.or.ddit.security.CustomAccessDeniedHandler"></bean>
 	
 	<!-- 로그인 성공시 다음의 클래스로 이동 -->
 	<bean id="customLoginSuccess" class="kr.or.ddit.security.CustomLoginSuccessHandler"></bean>
 	
 	<!-- 사용자가 정의한 비밀번호 암호화 처리기를 빈으로 등록함 -->
 	<bean id="customPassswordEncoder" class="kr.or.ddit.security.CustomNoOpPasswordEncoder"></bean>
 	
 	<!-- 스프링 시큐리티에서 제공하는 BCryptPasswordEncoder 클래스를 자바빈으로 등록함 -->
<!--  	<bean id="bcryptPasswordEncoder" class="org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder"></bean> -->
 	
 	<!-- 사용자정의 사용자 상세 기능  **** 중요-->
 	<bean id="customUserDetailsService" class="kr.or.ddit.security.CustomUserDetailsService"></bean>
 	
 	<!-- xmlns : xml namespace의 약자
 		Role : 권한(authorization)
 		permitAll : 누구나 접근 가능
 		hasRole : 권한을 갖은가인가?
 	 -->
 	<security:http>
 		<!-- URI 패턴으로 접근 제한을 설정 -->
 		<security:intercept-url pattern="/board/list" access="permitAll"/>
 		<security:intercept-url pattern="/board/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/> -->
 
 		<!-- 사용자가 정의한 로그인 페이지의 URI를 지정함 -->
 		<security:form-login login-page="/login" 
 			authentication-success-handler-ref="customLoginSuccess"/>
 		
 		<!-- 로그인이 된 회원중에 권한이 없을때.. -->
 		<!-- 접근(access) 거부(denied) 처리자(handler)의 URI를 지정 -->
<!--  		<security:access-denied-handler error-page="/accessError"/> -->

		
		<!-- 등록한 CustomAccessDeniedHandler를 접근 거부 처리자로 지정함 
		customAccessDenied 객체를 reference(참조-바라본다)함-->
		<security:access-denied-handler ref="customAccessDenied"/>

 	</security:http>
 	
 	
 	
 	<!-- authentication : 인증(로그인) 
 	1) 회원 게시판(board)
 		가) 목록("/board/list") : 모두가 접근 가능
 		나) 등록("/board/register") : 로그인한 회원만 접근가능
 	2) 공지사항 게시판(notice)
 		가) 목록("/notice/list") : 모두가 접근 가능
 		나) 등록 ("/notice/register"): 로그인한 관리자만 접근가능
 		
 	1  회원(USERS)테이블 : USERNAME,PASSWORD, ENABLED 
 	
 	N 권한(AUTH)테이블 : USERNAME, AUTHRIZE
 	-->
 	
 	<security:authentication-manager>
 		<!-- 지정된 아이디와 패스워드로 로그인이 가능하도록 설정 
 		authentication-provider : 인증(로그인) 제공자
 		-->
 		<security:authentication-provider user-service-ref="customUserDetailsService">
 			<!-- DB를 사용하겠다 라는 의미. 데이터 소스를 지정.//dataSource => root-context에 등록한 bean(객체) -->
<!--  			<security:jdbc-user-service data-source-ref="dataSource"/> -->
 			
 			<!-- 사용자가 정의한 비밀번호 암호화 처리기를 지정(암호화를 안쓰겠다는 의미)-->
			<security:password-encoder ref="customPassswordEncoder" />
			
			<!-- BCryptPasswordEncoder비밀번호 암호화 처리기를 사용하겠다는 뜻 -->
<!-- 			<security:password-encoder ref="bcryptPasswordEncoder" /> -->


 		</security:authentication-provider>
 	</security:authentication-manager>
 
 
 </beans>

 

 

---권한 불일치시 

 	<bean id="customAccessDenied" class="kr.or.ddit.security.CustomAccessDeniedHandler"></bean>

 

 

---권한일치시

 	<!-- 로그인 성공시 다음의 클래스로 이동 -->
 	<bean id="customLoginSuccess" class="kr.or.ddit.security.CustomLoginSuccessHandler"></bean>

Comments