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로 처리하는 메서드 만들기
다음 포스트에서 이어 적겠습니다.