2015-08-17 4 views
6

Ich verwende Spring Sicherheitsversion 3.1.4.RELEASE. Wie kann ich auf das aktuell angemeldete Benutzerobjekt zugreifen?Wie erhalte ich das aktuell angemeldete Benutzerobjekt von der Federsicherheit?

SecurityContextHolder.getContext().getAuthentication().getPrinciple() 

gibt den Benutzernamen zurück, nicht das Benutzerobjekt. Wie kann ich den zurückgegebenen Benutzernamen verwenden und das Objekt UserDetails abrufen?

Ich habe den folgenden Code versucht:

public UserDetails getLoggedInUser(){ 

    final Authentication auth = SecurityContextHolder.getContext().getAuthentication(); 
    if (auth != null && auth.isAuthenticated() && !(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; 
} 

Im Anschluss an das Ergebnis:

[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 

AuthenticationFilter Klasse wie folgt:

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 && !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; 
    } 
} 

AuthenticationProvider wie folgt:

wie folgt

Userdetails Klasse:

public class MyUserDetailsService implements UserDetailsService {  
    private final Map<String, UserDetails> usersList; 

    public MyUserDetailsService() { 
     Collection<GrantedAuthority> authorityList; 
     final SimpleGrantedAuthority supervisorAuthority = new SimpleGrantedAuthority("supervisor"); 
     final SimpleGrantedAuthority userAuthority = new SimpleGrantedAuthority("user"); 
     usersList = new TreeMap<String, UserDetails>(); 

     authorityList = new ArrayList<GrantedAuthority>(); 
     authorityList.add(supervisorAuthority); 
     authorityList.add(userAuthority); 
     usersList.put("admin", new User("admin", "admin", authorityList)); 

     authorityList = new ArrayList<GrantedAuthority>(); 
     authorityList.add(userAuthority); 
     usersList.put("peter", new User("peter", "password123", authorityList)); 

     //probably don't use this in production 
     for(Map.Entry<String, UserDetails> 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); 
    } 
} 
+0

Wie Sie Ihre Benutzer authentifizieren? Was ist der AuthenticationProvider und was ist der Filter? –

+0

Ok, Sie haben einen benutzerdefinierten Authentifizierungsfilter in der Nähe eines UsernamePasswordAuthenticationFilter. Es ist üblich, einen DaoAuthenticationProvider damit zu verwenden. Haben Sie 'setForcePrincipalAsString (True)' (oder setzen Sie 'forcePrincipalAsString' auf true) an einer beliebigen Stelle? –

+0

@SergeBallesta Nein Ich habe diese Methoden nicht verwendet – Leejoy

Antwort

3

Sie gingen nur einen Schritt foo weit. SecurityContextHolder.getContext().getAuthentication() gibt ein Objekt Authentication zurück. Sie sollten wissen, wie Sie den Benutzer authentifiziert haben, und was kann die konkrete Klasse implementieren Authentication. Unter der Annahme, es ist eine Unterklasse von AbstractAuthenticationToken (alle Feder Umsetzung sind) und getDetails() kehrt ein UserDetails, können Sie einfach verwenden:

AbstractAuthenticationToken auth = (AbstractAuthenticationToken) 
    SecurityContextHolder.getContext().getAuthentication(); 
UserDetails details = (UserDetails) auth.getDetails(); 
+0

Ich erhalte eine Instanz von WebAuthenticationDetails anstelle von UserDetails. – Leejoy

5

Sie es wie

Object principal = SecurityContextHolder.getContext().getAuthentication().getPrincipal(); 

if (principal instanceof UserDetails) { 
String username = ((UserDetails)principal).getUsername(); 
} else { 
String username = principal.toString(); 
} 

ist es im Frühjahr Sicherheit verwenden können Referenz http://docs.spring.io/spring-security/site/docs/4.0.2.RELEASE/reference/htmlsingle/#obtaining-information-about-the-current-user

+0

Ich bekomme Benutzername, aber nicht Benutzerobjekt. – Leejoy

+0

Ich denke, Sie müssen den nächsten Absatz nach dem oben genannten http://docs.spring.io/spring-security/site/docs/4.0.2.RELEASE/reference/htmlsingle/#tech-userdetailsservice überprüfen, um Benutzerdetails zu erhalten using UserDetailsService –

7
SecurityContextHolder.getContext().getAuthentication().getPrincipal(); 

Gibt das aktuelle Benutzerobjekt zurück. Dies kann User, UserDetails oder Ihr benutzerdefinierter Benutzer Objekt sein. Entsprechend Ihrem Code müssen Sie es in UserDetails umwandeln.

ODER Sie können Authentication oder Principal direkt in Ihre Controller injizieren. Prinzip ist Ihr Objekt UserDetails.

Hinweis: UserDetails ist eine Schnittstelle

+0

[Auch ein mkyong How-to w/etwas mehr Details.] (http://www.mkyong.com/spring-security/get-current-logged-in-username-in-spring-security/) – smeeb

+0

Wie bekomme ich die ID des Benutzers? –

+0

Es gibt ein Feld Username (String) in der User/UserDetails-Klasse/Schnittstelle, wenn die ID Ihres Benutzers der Benutzername ist. – sura2k

Verwandte Themen