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.
fonte
2014-04-09 17:52:33
Hai fortuna a risolvere questo? Ho lo stesso problema oggi. –
No, ho morso il proiettile e ho usato le stringhe = ( – user1751547