Spring Security _ 커스텀 서비스 구현

dwanGim·2022년 7월 5일
0

spring_basic

목록 보기
30/41

security service 구현

service 구현의 순서는 늘

VO -> mapper -> (Test 잠깐) -> service구현 ->bean 추가였었습니다.

mapper를 작성하고 test도 했으니 service를 구현해보겠습니다.

package com.ict.security;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.core.userdetails.UsernameNotFoundException;

import com.ict.mapper.MemberMapper;

import lombok.extern.log4j.Log4j;

@Log4j
public class CustomUserDetailsService implements UserDetailsService {
	
	@Autowired
	private MemberMapper mapper;
	
	@Override
	public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
		
		log.warn("유저 이름 확인 : " + username);
		
		return null;
	}

	
}

기본 user detail service를 상속받아 커스텀 서비스를 생성합니다.

이제 security-context.xml에 service를 적용하는 bean을 추가해주겠습니다.

<?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">

	<bean id="customAccessDenied" class="com.ict.security.CustomAccessDeniedHandler"/>
	<bean id="customLoginSuccess" class="com.ict.security.CustomLoginSuccessHandler"/>
	<!-- 비밀번호 복호화 -->
	<bean id="bcryptPasswordEncoder" class="org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder"/>
	<bean id="customUserDetailsService" class="com.ict.security.CustomUserDetailsService"/>
	
	<!-- 접속 시 폼 계정 등 -->
	<security:http>
		
		<!-- /secu/all 접속 시 모든 유저에게 접근 허용 permitAll -->
		<security:intercept-url pattern="/secu/all" access="permitAll" />
		
		<!-- member에게만 접근 허용 -->
		<security:intercept-url pattern="/secu/member" access="hasRole('ROLE_MEMBER')"/>
		<!-- secu/admin은 admin에게만 접근 허용 -->
		<security:intercept-url pattern="/secu/admin" access="hasRole('ROLE_ADMIN')" />	
		
		<!-- 에러페이징 -->
		<!-- 디폴트 accessdeniedhandler 대신 커스텀을 쓰도록 수정하였습니다. -->
		<!--  <security:access-denied-handler error-page="/accessError"/>-->
		<security:access-denied-handler ref="customAccessDenied"/>
		<!-- beans graph에 추가되어있는지 확인해주세요 -->
	
		<!-- 로그아웃 처리 -->
		<security:logout logout-url="/customLogout" invalidate-session="true"/>

		<security:form-login login-page="/customLogin"
				authentication-success-handler-ref="customLoginSuccess"/>
		
		
		
	</security:http>
	
		<!-- 인증 -->
	<security:authentication-manager>
		<security:authentication-provider user-service-ref="customUserDetailsService">

			<!--  <security:jdbc-user-service data-source-ref="dataSource"/>-->
		
			<security:password-encoder ref="bcryptPasswordEncoder"/>
		
		</security:authentication-provider>
		
	</security:authentication-manager>


</beans>

위와 같이 XML 설정까지 마저 마치고 나면 톰캣서버를 통해 로그인을 해보겠습니다.

유저 이름은 받아오는데 에러가 뜹니다.

왜냐면

이곳을 UserDetails를 리턴하도록 수정해주어야 합니다.

그러려면 MemberVO와 AuthVO가 LEFT JOIN한 UserDetails 오브젝트로

자료형을 받아올 수 있도록 설정해주어야 합니다.

원하는 value object로 처리하는 메서드 만들기

다음 포스트에서 이어 적겠습니다.

profile
배울 게 참 많네요.

0개의 댓글