@Service
public class UserService implements UserDetailsService {
private final UserRepository userRepository;
public UserService(UserRepository userRepository) {
this.userRepository = userRepository;
}
@Override
@Transactional(readOnly = true)
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
return userRepository.findByLoginId(username)
.map(user ->
User.builder()
.username(user.getLoginId())
.password(user.getPasswd())
.authorities(user.getGroup().getAuthorities())
.build()
)
.orElseThrow(() -> new UsernameNotFoundException("Could not found user for " + username));
}
}
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.userDetailsService(userService);
}
Custom UserDetailsService을 Bean으로 등록하기만해도 잘 전달된다. 두 방식의 차이는 뭘까? AuthenticationManagerBuilder를 이용하여 Custom UserDetailsService를 등록하였을까?
<dependency>
<groupId>org.springframework.session</groupId>
<artifactId>spring-session-jdbc</artifactId>
</dependency>
redis와 같이 다른 종류의 스토리지를 사용하고 싶은 경우 아래와 같이 의존성을 추가한다.
<dependency>
<groupId>org.springframework.session</groupId>
<artifactId>spring-session-redis</artifactId>
</dependency>
session:
store-type: jdbc
만약 redis를 사용할 거라면 아래와 같이 설정하면 된다.
session:
store-type: redis
MapSessionRepository
In-Memory Map 기반으로서 별도의 의존 라이브러리가 필요하지 않다.
RedisIndexedSessionRepository
redis 기반이며, @EnableRedisHttpSession
어노테이션으로 생성된다.
JdbcIndexedSessionRepository
jdbc 기반이며, @EnableJdbcHttpSession
어노테이션으로 생성된다.
HttpServletRequest
, HttpServletResponse
인터페이스 구현을 SessionRepositoryRequestWrapper
, SessionRepositoryResponseWrapper
구현체로 교체한다.SessionRepositoryRequestWrapper
에서 getSession()
을 오버라이드하고 있다.(session을 가지고 오거나 생성하거나)