Acegi Sicherheit: Wie kann ich eine andere GrantedAuthority anonymen Benutzer auf Authentifizierungs

StackOverflow https://stackoverflow.com/questions/283870

Frage

i geben den Benutzern spezielle URL mit Zugriffsschlüssel drin. Benutzer, die Öffentlichkeit Seite über diese spezielle URL zugreifen sollten einige zusätzlichen Daten im Vergleich zu einfachen anonymen Benutzern sehen können.

Ich mag einige zusätzliche Rolle für anonyme Benutzer geben, basierend auf Parameter in Anfrage zur Verfügung gestellt, damit ich so etwas in meiner Vorlage tun können:

<@sec.authorize ifAnyGranted="ROLE_ADMIN, ROLE_USER, ROLE_INVITED_VISITOR">
...some additional stuff for invited user to see
</@sec.authorize>

bin derzeit die Umsetzung i Spring OncePerRequestfilter:

protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain) throws ServletException, IOException {
    if (null != request.getParameter("accessKey")) {
        if(isValid(request.getParameter("accessKey"))) {
            Authentication auth = SecurityContextHolder.getContext().getAuthentication();
            //how do i add additional roles to authenticated (potentially anonymous) user?
        }
    }
}
War es hilfreich?

Lösung

Warum nicht nur eine Wrapper-Klasse, dass die Delegierten auf das Original, fügt aber hinzu, auf ein paar zusätzlichen GrantedAuthorities:

public class AuthenticationWrapper implements Authentication
{
   private Authentication original;
   private GrantedAuthority[] extraRoles;

   public AuthenticationWrapper( Authentication original, GrantedAuthority[] extraRoles )
   {
      this.original = original;
      this.extraRoles = extraRoles;
   }

   public GrantedAuthority[] getAuthorities()
   {
      GrantedAuthority[] originalRoles = original.getAuthorities();
      GrantedAuthority[]  roles = new GrantedAuthority[originalRoles.length + extraRoles.length];
      System.arraycopy( originalRoles, 0, roles, 0, originalRoles.length );
      System.arraycopy( extraRoles, 0, roles, originalRoles.length, extraRoles.length );
      return roles;
   }

   public String getName() { return original.getName(); }
   public Object getCredentials() { return original.getCredentials(); }
   public Object getDetails() { return original.getDetails(); }   
   public Object getPrincipal() { return original.getPrincipal(); }
   public boolean isAuthenticated() { return original.isAuthenticated(); }
   public void setAuthenticated( boolean isAuthenticated ) throws IllegalArgumentException
   {
      original.setAuthenticated( isAuthenticated );
   }  
}

und dann tun Sie dies in Ihrem Filter:

Authentication auth = SecurityContextHolder.getContext().getAuthentication();
GrantedAuthority extraRoles = new GrantedAuthority[2];
extraRoles[0] = new GrantedAuthorityImpl( "Role X" );
extraRoles[1] = new GrantedAuthorityImpl( "Role Y" );
AuthenticationWrapper wrapper = new AuthenticationWrapper( auth, extraRoles );
SecurityContextHolder.getContext().setAuthentication( wrapper );

Die Authentifizierung wird jetzt von Ihrer Version mit den zusätzlichen Rollen ersetzt. NB Sie müssen den Fall behandeln kann, wenn die Authentifizierung noch nicht authentifiziert wurde und seine getAuthorities so () gibt den Wert null. (Die Wrapper Umsetzung geht derzeit davon aus, dass es immer einen Nicht-Null-Array aus seiner eingewickelt Authentifizierung erhalten wird)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top