나누고 싶은 개발 이야기

Data Engineer로서 기록하고 공유하고 싶은 기술들. 책과 함께 이야기합니다.

Framework/spring

[spring security] Controller에서 Principal 가져오기

devidea 2016. 3. 24. 17:09

일단 Principal의 개념을 알아보자.


Spring Security의 공식 문서를 보면 What is Spring Security

Principal은 시스템을 사용하려고 하는 사용자, 디바이스 혹은 시스템을 통칭한다.


Request에 대한 로직을 처리하는 과정에서 인증된 사용자에 대한 정보는 계속 필요할 것이다.


가장 간단한 방법으로 Controller의 파라미터로 Principal을 설정해 받을 수 있다.

public ModelAndView someRequestHandler(Principal principal) {
   User activeUser = (User) ((Authentication) principal).getPrincipal();
    ... 
}


하지만, 위와 같이 처리를 하면 .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