title: How to get the current logged in user object from spring security?
body: <p>I am using Spring security version 3.1.4.RELEASE.
  How can I access the current logged in user object?</p>
  
  <pre><code>SecurityContextHolder.getContext().getAuthentication().getPrinciple()
  </code></pre>
  
  <p>returns user name, not user object. So how can I use the returned Username and get the UserDetails object?</p>
  
  <p>I have tried the following code:</p>
  
  <pre><code>public UserDetails getLoggedInUser(){
  
      final Authentication auth = SecurityContextHolder.getContext().getAuthentication();
      if (auth != null &amp;&amp; auth.isAuthenticated() &amp;&amp; !(auth instanceof AnonymousAuthenticationToken))
      {
          if(auth.getDetails() !=null)
              System.out.println(auth.getDetails().getClass());
          if( auth.getDetails() instanceof UserDetails)
          {
              System.out.println("UserDetails");
          }
          else
          {
              System.out.println("!UserDetails");
          }
      }
      return null;
  }
  </code></pre>
  
  <p>Following is the result:</p>
  
  <pre><code>[2015-08-17 19:44:46.738] INFO  http-bio-8443-exec-423   System.out    class org.springframework.security.web.authentication.WebAuthenticationDetails 
  [2015-08-17 19:44:46.738] INFO  http-bio-8443-exec-423   System.out    !UserDetails
  </code></pre>
  
  <p>AuthenticationFilter class as follows:</p>
  
  <pre><code>public class CustomUsernamePasswordAuthenticationFilter extends AbstractAuthenticationProcessingFilter {
      public static final String SPRING_SECURITY_FORM_USERNAME_KEY = "j_username";
      public static final String SPRING_SECURITY_FORM_PASSWORD_KEY = "j_password";
      public static final String SPRING_SECURITY_LAST_USERNAME_KEY = "SPRING_SECURITY_LAST_USERNAME";
      private String usernameParameter = SPRING_SECURITY_FORM_USERNAME_KEY;
      private String passwordParameter = SPRING_SECURITY_FORM_PASSWORD_KEY;
      private boolean postOnly = true;
  
      public CustomUsernamePasswordAuthenticationFilter() {
          super("/j_spring_security_check");
      }
  
      public Authentication attemptAuthentication(HttpServletRequest request, HttpServletResponse response) throws AuthenticationException {
          if (postOnly &amp;&amp; !request.getMethod().equals("POST")) {
              throw new AuthenticationServiceException("Authentication method not supported: " + request.getMethod());
          }
  
          String username = obtainUsername(request);
          String password = obtainPassword(request);
          if (username == null) {
              username = "";
          }
          if (password == null) {
              password = "";
          }
          username = username.trim();
          UsernamePasswordAuthenticationToken authRequest = new UsernamePasswordAuthenticationToken(username, password);
  
          // Allow subclasses to set the "details" property
          setDetails(request, authRequest);
          if(this.getAuthenticationManager()==null){
              logger.info("Authentication manager is null.");
          } else {
              logger.info("Authentication manager was "+this.getAuthenticationManager().getClass().getName()); 
          }
          return this.getAuthenticationManager().authenticate(authRequest);
      }
  
      protected String obtainPassword(HttpServletRequest request) {
          return request.getParameter(passwordParameter);
      }
  
      protected String obtainUsername(HttpServletRequest request) {
          return request.getParameter(usernameParameter);
      }
  
      protected void setDetails(HttpServletRequest request, UsernamePasswordAuthenticationToken authRequest) {
          authRequest.setDetails(authenticationDetailsSource.buildDetails(request));
      }
  
      public void setUsernameParameter(String usernameParameter) {
          this.usernameParameter = usernameParameter;
      }
  
      public void setPasswordParameter(String passwordParameter) {
          this.passwordParameter = passwordParameter;
      }
  
      public void setPostOnly(boolean postOnly) {
          this.postOnly = postOnly;
      }
  
      public final String getUsernameParameter() {
          return usernameParameter;
      }
  
      public final String getPasswordParameter() {
          return passwordParameter;
      }
  }
  </code></pre>
  
  <p>AuthenticationProvider as follows:</p>
  
  <pre><code>@Component
  public class CustomAuthenticationProvider extends AbstractUserDetailsAuthenticationProvider {
      private MyUserDetailsService userDetailsService;
  
      public MyUserDetailsService getUserDetailsService() {
          return userDetailsService;
      }
  
      public void setUserDetailsService(MyUserDetailsService userDetailsService) {
          this.userDetailsService = userDetailsService;
      }
  
      @Override
      protected void additionalAuthenticationChecks(UserDetails arg0,
              UsernamePasswordAuthenticationToken arg1)
              throws AuthenticationException {
  
      }
  
      @Override
      protected UserDetails retrieveUser(String arg0,
              UsernamePasswordAuthenticationToken arg1)
              throws AuthenticationException {
          return userDetailsService.loadUserByUsername(arg0);
      }
  }
  </code></pre>
  
  <p>UserDetails class as follows:</p>
  
  <pre><code>    public class MyUserDetailsService implements UserDetailsService {       
      private final Map&lt;String, UserDetails&gt; usersList;
  
      public MyUserDetailsService() {
          Collection&lt;GrantedAuthority&gt; authorityList;
          final SimpleGrantedAuthority supervisorAuthority = new SimpleGrantedAuthority("supervisor");
          final SimpleGrantedAuthority userAuthority = new SimpleGrantedAuthority("user");
          usersList = new TreeMap&lt;String, UserDetails&gt;();
  
          authorityList = new ArrayList&lt;GrantedAuthority&gt;();
          authorityList.add(supervisorAuthority);
          authorityList.add(userAuthority);
          usersList.put("admin", new User("admin", "admin", authorityList));
  
          authorityList = new ArrayList&lt;GrantedAuthority&gt;();
          authorityList.add(userAuthority);
          usersList.put("peter", new User("peter", "password123", authorityList));
  
          //probably don't use this in production
          for(Map.Entry&lt;String, UserDetails&gt; user : usersList.entrySet()){
              logger.info(user.getValue().toString());
          }
      }
  
      @Override
      public UserDetails loadUserByUsername(String username)throws UsernameNotFoundException {
          UserDetails ud = usersList.get(username);
          if (ud != null) {
              logger.info("loadUserByUsername: found match, returning "
                      + ud.getUsername() + ":" + ud.getPassword() + ":"
                      + ud.getAuthorities().toString());
              return new User(ud.getUsername(), ud.getPassword(),
                      ud.getAuthorities());
          }
  
          logger.info("loadUserByUsername: did not find match, throwing UsernameNotFoundException");
          throw new UsernameNotFoundException(username);
      }
  }
  </code></pre>