7

La mia domanda è una copia di Custom annotation with spring security ma è rimasta senza risposta e credo che ci dovrebbe essere una soluzione semplice al problema.Spring Security @PreAuthorization passa enum direttamente in

In sostanza, invece di fare:

@PreAuthorize("hasPermission(T(fully.qualified.Someclass).WHATEVER, T(fully.qualified.Permission).READ") 

Vorrei fare:

@PreAuthorize(Someclass.WHATEVER, Permission.READ) 

o forse qualche annotazione personalizzato che cablare facilmente con sicurezza a molla

Questo sembra molto più pulito per me e mi piacerebbe essere in grado di farlo se posso.

+0

Hai fortuna a risolvere questo? Ho lo stesso problema oggi. –

+0

No, ho morso il proiettile e ho usato le stringhe = ( – user1751547

risposta

5

Di fronte allo stesso problema, ho trovato una soluzione ibrida. Sto usando Spring-El e un bean personalizzato per fornire il mio metodo hasPermission() che accetta un Enum. Dato che Spring esegue una conversione automatica di string->enum, in fase di esecuzione, otterrò un'eccezione di runtime che un enum particolare non esiste se c'è un errore di battitura nella stringa. Non è la soluzione ideale (avrebbe piuttosto avuto qualcosa che non andava a buon fine in fase di compilazione), ma un compromesso accettabile. Mi dà un po 'di sicurezza di semi-tipo.

@Component("securityService") 
public class SecurityService { 
    public boolean hasPermission(Permission...permissions){ 
     // loop over each submitted role and validate the user has at least one 
     Collection<? extends GrantedAuthority> userAuthorities = SecurityContextHolder.getContext().getAuthentication().getAuthorities(); 
     for(Permission permission : permissions){ 
      if(userAuthorities.contains(new SimpleGrantedAuthority(permission.name()))) 
       return true; 
     } 

     // no matching role found 
     return false; 
    } 
} 

utilizzati come segue:

@PreAuthorize("@securityService.hasPermission({'USER_ADD'})") 
public User addUser(User user){ 
    // create the user 
    return userRepository.save(user); 
} 

Dove permesso è solo un normale definizione enum:

public enum Permission { 
    USER_LIST, 
    USER_EDIT, 
    USER_ADD, 
    USER_ROLE_EDIT 
} 

Spero che questo possa aiutare qualcun altro in futuro.

-1

ho fatto in questo modo:

1 - Definire l'enum riferimento a un "valore" pubblico finale String statico come questo

public enum MyEnum { 
    ENUM_A(Names.ENUM_A); 

    private String value; 

    private MyEnum (String value) { 
     this.value = value; 
    } 

    public static class Names { 

     public final static String ENUM_A = "ENUM_A"; 
    } 
} 

2 - valori Concat MyEnum in @PreAuthorize

@PreAuthorize("hasPermission('myDomain', '"+ MyEnum.Names.ENUM_A+"')")