일단 Principal의 개념을 알아보자.
Spring Security의 공식 문서를 보면 What is Spring Security
Principal은 시스템을 사용하려고 하는 사용자, 디바이스 혹은 시스템을 통칭한다.
Request에 대한 로직을 처리하는 과정에서 인증된 사용자에 대한 정보는 계속 필요할 것이다.
가장 간단한 방법으로 Controller의 파라미터로 Principal을 설정해 받을 수 있다.
public ModelAndView someRequestHandler(Principal principal) {
User activeUser = (User) ((Authentication) principal).getPrincipal();
...
}
이럴때, WebArgumentResolver를 구현해서 입력받는 파라미터의 타입에 따라 커스터마이징 할 수 있는 방법이 있다.
public class UserMethodArgumentResolver implements HandlerMethodArgumentResolver {
@Override
public boolean supportsParameter(MethodParameter parameter) {
Class<?> parameterType = parameter.getParameterType();
return UserEntity.class.equals(parameterType);
}
@Override
public Object resolveArgument(MethodParameter parameter,
ModelAndViewContainer mavContainer,
NativeWebRequest webRequest,
WebDataBinderFactory binderFactory) throws Exception {
Authentication auth = AuthorityUtils.getAuthentication();
if (auth == null)
return null;
Object principal = auth.getPrincipal();
Class<?> parameterType = parameter.getParameterType();
if (principal instanceof UserEntity) {
UserEntity userEntity = (UserEntity) principal;
if (userEntity.class.equals(parameterType)) {
return userEntity;
}
}
return null;
}
}
구현한 UserMethodArgumentResolver를 configuration에 추가해 주면 된다.
아래는 xml이 아닌 java code로 @Configuration을 등록한 내용이다.
@Configuration
public class InfraWebConfig extends WebMvcConfigurerAdapter {
@Override
public void addArgumentResolvers(List<handlermethodargumentresolver> argumentResolvers) {
argumentResolvers.add(new UserMethodArgumentResolver());
}
}
Configuration의 등록까지 마치게 되면 결과적으로 아래와 같이 간단하게 Principal을 얻을 수 있다.
public UserEntity success(UserEntity user, HttpServletRequest request) {
return user;
}
반응형
'Framework > spring' 카테고리의 다른 글
[spring boot] spring boot configuration 이해 (0) | 2017.08.30 |
---|---|
[spring] lifecycle mechanisms (0) | 2017.08.29 |
[spring] cache (0) | 2017.08.29 |
스프링 팁: *Utils 클래스 활용 (0) | 2017.04.03 |