Pensa a un GrantedAuthority come a un "permesso" o un "diritto". Tali "permessi" sono (normalmente) espressi come stringhe (con il getAuthority()metodo). Queste stringhe ti consentono di identificare le autorizzazioni e lasciare che i tuoi elettori decidano se concedere l'accesso a qualcosa.
È possibile concedere diverse autorizzazioni (autorizzazioni) agli utenti inserendole nel contesto di sicurezza. Normalmente lo fai implementando il tuo UserDetailsService che restituisce un'implementazione UserDetails che restituisce le necessarie GrantedAuthorities.
I ruoli (come vengono utilizzati in molti esempi) sono solo "autorizzazioni" con una convenzione di denominazione che afferma che un ruolo è un GrantedAuthority che inizia con il prefisso ROLE_. Non c'è altro. Un ruolo è solo un GrantedAuthority - un "permesso" - un "diritto". Si vedono molti posti nella sicurezza primaverile in cui il ruolo con il suo ROLE_prefisso viene gestito specialmente come ad es. In RoleVoter, dove il ROLE_prefisso viene utilizzato come predefinito. Ciò consente di fornire i nomi dei ruoli senza il ROLE_prefisso. Prima di Spring Security 4, questa particolare gestione dei "ruoli" non è stata seguita in modo molto coerente e le autorità e i ruoli sono stati spesso trattati allo stesso modo (ad es.hasAuthority()hasRole()). Con Spring Security 4, il trattamento dei ruoli è più coerente e il codice che si occupa di "ruoli" (come RoleVoter, l' hasRoleespressione, ecc.) Aggiunge sempre il ROLE_prefisso per te. Quindi hasAuthority('ROLE_ADMIN')significa lo stesso hasRole('ADMIN')perché il ROLE_prefisso viene aggiunto automaticamente. Consulta la guida alla migrazione da 3 a 4 di Spring Security per ulteriori informazioni.
Ma comunque: un ruolo è solo un'autorità con un ROLE_prefisso speciale . Quindi in Spring Security 3 @PreAuthorize("hasRole('ROLE_XYZ')")è uguale a @PreAuthorize("hasAuthority('ROLE_XYZ')")e in Spring Security 4 @PreAuthorize("hasRole('XYZ')")è uguale a @PreAuthorize("hasAuthority('ROLE_XYZ')").
Per quanto riguarda il tuo caso d'uso:
Gli utenti hanno ruoli e ruoli possono eseguire determinate operazioni.
Potresti finire GrantedAuthoritiesper i ruoli a cui appartiene un utente e le operazioni che un ruolo può svolgere. Il GrantedAuthoritiesper i ruoli ha il prefisso ROLE_e le operazioni hanno il prefisso OP_. Un esempio per le autorità operazione potrebbe essere OP_DELETE_ACCOUNT, OP_CREATE_USER, OP_RUN_BATCH_JOBecc ruoli possono essere ROLE_ADMIN, ROLE_USER, ROLE_OWNERetc.
Potresti finire per avere le tue entità implementate GrantedAuthoritycome in questo esempio (pseudo-codice):
@Entity
class Role implements GrantedAuthority {
@Id
private String id;
@ManyToMany
private final List<Operation> allowedOperations = new ArrayList<>();
@Override
public String getAuthority() {
return id;
}
public Collection<GrantedAuthority> getAllowedOperations() {
return allowedOperations;
}
}
@Entity
class User {
@Id
private String id;
@ManyToMany
private final List<Role> roles = new ArrayList<>();
public Collection<Role> getRoles() {
return roles;
}
}
@Entity
class Operation implements GrantedAuthority {
@Id
private String id;
@Override
public String getAuthority() {
return id;
}
}
Gli ID dei ruoli e delle operazioni creati nel database sarebbero la rappresentazione GrantedAuthority, ad esempio ROLE_ADMIN, OP_DELETE_ACCOUNTecc. Quando un utente viene autenticato, assicurarsi che tutte le Autorità Granted di tutti i suoi ruoli e le operazioni corrispondenti vengano restituite da UserDetails.getAuthorities () metodo.
Esempio: il ruolo admin con id ROLE_ADMINha le operazioni OP_DELETE_ACCOUNT, OP_READ_ACCOUNT, OP_RUN_BATCH_JOBassegnati ad esso. Il ruolo utente con ID ROLE_USERha l'operazione OP_READ_ACCOUNT.
Se un utente di amministrazione nel contesto di protezione risultante avrà le GrantedAuthorities:
ROLE_ADMIN, OP_DELETE_ACCOUNT, OP_READ_ACCOUNT,OP_RUN_BATCH_JOB
Se un utente accede, esso avrà:
ROLE_USER,OP_READ_ACCOUNT
UserDetailsService si occuperà di raccogliere tutti i ruoli e tutte le operazioni di tali ruoli e di renderli disponibili con il metodo getAuthorities () nell'istanza UserDetails restituita.