728x90
반응형
SMALL
1. UserDetails
Spring Security에서 사용자의 정보를 담는 인터페이스는 UserDetails 인터페이스이다
사용자의 정보를 모두 담아두는 클래스를 구현할 것이다.
2.UserDetailsService
사용자의 정보를 담을 객체를 만들었으니, DB에서 유저 정보를 직접 가져오는 인터페이스
UserDetailsService 인터페이스에는 DB에서 유저 정보를 불러오는 중요한 메소드가 존재한다.
바로 loadUserByUsername() 메소드
여기에서 CustomUserDetails 형으로 사용자의 정보를 가져오면 된다.
CustomUserDetailsService
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
@Log4j
public class CustomUserDetailsService implements UserDetailsService{
@Setter(onMethod_ = {@Autowired})
private MemberMapper memberMapper;
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
log.warn("Load User By UserName : "+username);
MemberVO vo = memberMapper.read(username);
log.warn("queried by member mapper: " + vo);
return vo == null ? null : new CustomUser(vo);
}
}
|
cs |
MemberMapper.java
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
|
<mapper namespace="org.zerock.mapper.MemberMapper">
<resultMap type="org.zerock.domain.MemberVO" id="memberMap">
<id property="userid" column="userid" />
<result property="userid" column="userid" />
<result property="userpw" column="userpw" />
<result property="userName" column="username" />
<result property="regDate" column="regdate" />
<result property="updateDate" column="updatedate" />
<collection property="authList" resultMap="authMap">
</collection>
</resultMap>
<resultMap type="org.zerock.domain.AuthVO" id="authMap" >
<result property="userid" column="userid" />
<result property="auth" column="auth" />
</resultMap>
<select id="read" resultMap="memberMap">
SELECT mem.userid, userpw, username, enabled, regdate, updatedate, auth
FROM tbl_member mem LEFT OUTER JOIN tbl_member_auth auth on mem.userid = auth.userid
WHERE mem.userid = #{userid}
</select>
</mapper>
|
cs |
3행의 MyBatis의 ResultMap을 이용하면 하나의 쿼리로 MemberVO와 내부의 AuthVO 리스트까지 처리할 수 있음
3.MemberVO.java - 사용자
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
@Data
public class MemberVO {
private String userid;
private String userpw;
private String userName;
private boolean enabled;
private Date regDate;
private Date updateDate;
private List<AuthVO> authList;
}
|
cs |
하나의 MemberVO 인스턴스는 내부적으로 여러개의 AuthVO를 가지는데 흔히 'N+1'관계라 칭함
즉, 하나의 데이터가 여러개의 하위 데이터를 포함하고 있는 것을 의미
AuthVO.java - 권한
1
2
3
4
5
6
7
8
|
@Data
public class AuthVO {
private String userid;
private String auth;
}
|
cs |
MemberMapper 테스트
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
@RunWith(SpringRunner.class)
@ContextConfiguration({"file:src/main/webapp/WEB-INF/spring/root-context.xml"})
@Log4j
public class MemberMapperTests {
@Setter(onMethod_= @Autowired)
private MemberMapper mapper;
@Test
public void testRead() {
MemberVO vo = mapper.read("admin90");
log.info(vo);
vo.getAuthList().forEach(authVO -> log.info(authVO));
}
}
|
cs |
테스트 코드를 통해서 MemberVO와 AuthVO가 같이 구성됨을 확인할 수 있다.
4.user-service-ref
security-context.xml 등록
1
2
3
4
5
6
7
8
9
10
11
12
13
|
<bean id="bcryptPasswordEncoder" class="org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder" />
<bean id="customUserDetailsService" class="org.zerock.security.CustomUserDetailsService" /
<security:authentication-manager>
<security:authentication-provider
user-service-ref="customUserDetailsService">
<!-- 패스워드 단방향 암호화 -->
<security:password-encoder ref="bcryptPasswordEncoder"/>
</security:authentication-provider>
</security:authentication-manager>
|
cs |
CustomUserDetailsService를 빈으로 등록하고
스프링 시큐리티 authentication-provider 속성에 CustomUserDetailsService빈을 지정해준다.
참고:to-dy.tistory.com/86?category=720806
ㅊ
5
728x90
반응형
LIST
'SPRING > 스프링-시큐리티' 카테고리의 다른 글
스프링-시큐리티 인증 절차 정리 (0) | 2021.06.30 |
---|---|
스프링MVC-시큐리티-OAUTH2 로 네이버아이디 로그인 하기(소셜로그인) (0) | 2021.06.29 |
스프링-시큐리티 CSRF 토큰설정을 통한 CRUD 처리(3) (0) | 2021.05.08 |
스프링 시큐리티- 인증 절차 MemberVO 를 UsersDetails로 변환(2) (0) | 2021.05.07 |