2017-12-31 164 views
-1

Ich habe die Github-Authentifizierung mit Spring Security OAuth2 erfolgreich bestanden. Die Benutzerrolle, die über Github erhalten wird, ist jedoch USER_ROLE.Kann ich die Rolle nach erfolgreicher Authentifizierung ändern?

Also habe ich mich gefragt, ob ich die entsprechende Rolle ändern könnte, indem ich Github-Benutzerinformationen beurteile, die erhalten wurden, nachdem die Autorisierung erfolgreich war, um die Berechtigungen des Benutzers zu kontrollieren.

Zum Beispiel getPrincipal(), um einen eindeutigen "Namen" zu erhalten. Ändern Sie dann die Rolle mit "Name" (z. B. "ADMIN"). Verwenden Sie schließlich @PreAuthorize ("hasRole ('ROLE_ADMIN')"), um die Berechtigungen zu steuern.

Oder gibt es noch andere bessere Lösungen? Ich möchte Githubs OAuth2-Autorisierung und rollenbasierte Rechteverwaltung in diese Anwendung integrieren.

Antwort

0

Die einfachste Option besteht darin, die aktuelle Authentifizierung zu erhalten und eine neue Instanz davon zu erstellen und sie auf dem SecurityContextHolder wie unter Direktes Festlegen der SecurityContextHolder-Inhalte beschrieben zu konfigurieren. Stellen Sie sicher, dass Sie die Auswirkungen der Authentifizierung in mehreren Threads verstehen (lesen Sie weiter unter reference to understand). Ein Beispiel eines GrantedAuthority der aktuellen Authentifizierungs der Zugabe ist unten angegeben:

// update the current Authentication 
Authentication auth = SecurityContextHolder.getContext().getAuthentication(); 
List<GrantedAuthority> authorities = new ArrayList<GrantedAuthority>(auth.getAuthorities()); 
authorities.add(new GrantedAuthorityImpl('ROLE_NEWROLE')); 
Authentication newAuth = new UsernamePasswordToken(auth.getPrincipal(),auth.getCredentials(),authorities) 
SecurityContextHolder.getContext().setAuthentication(newAuth); 
+0

BenutzernamePasswordToken ist falsch. OAuth und andere Authentifizierungsmethoden sind unterschiedlich. Schließlich habe ich das Problem gelöst, indem ich den OAuth2ClientAuthenticationProcessingFilter neu erstellt und die Methode successfulAuthentication überschrieben habe. Der entscheidende Punkt ist, dass der erste Schritt darin besteht, nach erfolgreicher Authentifizierung festzustellen, ob es sich um mein Github-Konto vom Principal handelt. Dann die aktuelle erfolgreiche Authentifizierung OAuth2Authentication von SecurityContextHolder.getContext(). GetAuthentication() erhalten. Erstellen Sie dann eine neue Authentifizierung und erstellen Sie eine neue OAuth2Authentication in SecurityContextHolder. – Cciradih

0

I die OAuth2ClientAuthenticationProcessingFilter endgültig gelöst durch Umbau und Überschreiben der successfulAuthentication Methode.

Der entscheidende Punkt ist, dass der erste Schritt ist festzustellen, ob es sich um mein Github-Konto von der Principal, nachdem die Authentifizierung erfolgreich ist.

Dann die aktuelle erfolgreiche Authentifizierung OAuth2Authentication von SecurityContextHolder.getContext(). GetAuthentication() erhalten. Erstellen Sie dann eine neue Authentifizierung und erstellen Sie eine neue OAuth2Authentication in SecurityContextHolder.

public class CustomOAuth2ClientAuthenticationProcessingFilter extends OAuth2ClientAuthenticationProcessingFilter { 
public CustomOAuth2ClientAuthenticationProcessingFilter(String defaultFilterProcessesUrl) { 
    super(defaultFilterProcessesUrl); 
} 

@Override 
protected void successfulAuthentication(HttpServletRequest request, HttpServletResponse response, FilterChain chain, Authentication authResult) throws IOException, ServletException { 
    super.successfulAuthentication(request, response, chain, authResult); 
    if (authResult.getPrincipal().equals("cciradih")) { 
     OAuth2Authentication oAuth2Authentication = (OAuth2Authentication) SecurityContextHolder.getContext().getAuthentication(); 
     SecurityContextHolder.getContext().setAuthentication(new OAuth2Authentication(oAuth2Authentication.getOAuth2Request(), new Authentication() { 
      @Override 
      public Collection<? extends GrantedAuthority> getAuthorities() { 
       return AuthorityUtils.createAuthorityList("ROLE_ADMIN", "ROLE_USER"); 
      } 

      @Override 
      public Object getCredentials() { 
       return oAuth2Authentication.getCredentials(); 
      } 

      @Override 
      public Object getDetails() { 
       return oAuth2Authentication.getUserAuthentication().getDetails(); 
      } 

      @Override 
      public Object getPrincipal() { 
       return oAuth2Authentication.getPrincipal(); 
      } 

      @Override 
      public boolean isAuthenticated() { 
       return oAuth2Authentication.getUserAuthentication().isAuthenticated(); 
      } 

      @Override 
      public void setAuthenticated(boolean isAuthenticated) throws IllegalArgumentException { 

      } 

      @Override 
      public String getName() { 
       return oAuth2Authentication.getName(); 
      } 
     })); 
    } 
} 
} 
Verwandte Themen