/* * To change this template, choose Tools | Templates * and open the template in the editor. */ package net.paulgray.lmsrest.web; import net.paulgray.lmsrest.user.UserService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.MethodParameter; import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.security.core.userdetails.User; import org.springframework.web.bind.support.WebDataBinderFactory; import org.springframework.web.context.request.NativeWebRequest; import org.springframework.web.method.support.HandlerMethodArgumentResolver; import org.springframework.web.method.support.ModelAndViewContainer; /** * * @author pfgray */ public class DefaultContextUserArgumentResolver implements HandlerMethodArgumentResolver { @Autowired UserService userService; @Override public boolean supportsParameter(MethodParameter mp) { return mp.hasParameterAnnotation(ContextUser.class); } @Override public Object resolveArgument(MethodParameter mp, ModelAndViewContainer mavc, NativeWebRequest nwr, WebDataBinderFactory wdbf) throws Exception { Boolean required = mp.getParameterAnnotation(ContextUser.class).required(); try { SecurityContextHolder.getContext().getAuthentication().getAuthorities(); Object o = SecurityContextHolder.getContext().getAuthentication().getPrincipal(); System.out.println("resolving user:" + o); if (o.getClass().equals(java.lang.String.class) && ((String) o).equals("anonymousUser")) { System.out.println("got anonymous"); if (required) { throw new NoContextUserException("Context User not found but required."); } else { return null; } } else if (o instanceof org.springframework.security.core.userdetails.User) { System.out.println("got user:" + ((User) o).getUsername()); return userService.getUserForUsername(((User) o).getUsername()); } else { System.out.println("The user principal returned from Spring's context authentication was not a String containing 'anonymousUser' or an instance of 'org.springframework.security.core.userdetails.User'."); throw new RuntimeException("The user principal returned from Spring's context authentication was not a String containing 'anonymousUser' or an instance of 'org.springframework.security.core.userdetails.User'."); } } catch (Exception e) { System.out.println("Caught exception: " + e); if (required) { throw new NoContextUserException("Context User not found but required."); } else { return null; } } } }