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' hasRole
espressione, 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 GrantedAuthorities
per i ruoli a cui appartiene un utente e le operazioni che un ruolo può svolgere. Il GrantedAuthorities
per 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_JOB
ecc ruoli possono essere ROLE_ADMIN
, ROLE_USER
, ROLE_OWNER
etc.
Potresti finire per avere le tue entità implementate GrantedAuthority
come 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_ACCOUNT
ecc. 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_ADMIN
ha le operazioni OP_DELETE_ACCOUNT
, OP_READ_ACCOUNT
, OP_RUN_BATCH_JOB
assegnati ad esso. Il ruolo utente con ID ROLE_USER
ha 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.