Pomyśl o GrantedAuthority jako o „pozwoleniu” lub „prawie”. Te „uprawnienia” są (normalnie) wyrażone jako ciągi znaków (za pomocągetAuthority()
metody). Te ciągi pozwalają zidentyfikować uprawnienia i pozwalają wyborcom zdecydować, czy przyznają dostęp do czegoś.
Można przyznać użytkownikom różne GrantedAuthority (uprawnienia), umieszczając je w kontekście bezpieczeństwa. Zwykle robisz to, implementując własną usługę UserDetailsService, która zwraca implementację UserDetails, która zwraca potrzebne GrantedAuthorities.
Role (jak są używane w wielu przykładach) są po prostu „uprawnieniami” z konwencją nazewnictwa, która mówi, że rolą jest GrantedAuthority, która zaczyna się od przedrostka ROLE_
. Nic więcej. Rolą jest po prostu GrantedAuthority - „pozwolenie” - „prawo”. Widzisz wiele miejsc w zabezpieczeniach wiosennych, w których rola z jej ROLE_
prefiksem jest obsługiwana specjalnie, jak np. W RoleVoter, gdzie ROLE_
prefiks jest używany domyślnie. Pozwala to na podanie nazw ról bez ROLE_
prefiksu. Przed Spring Security 4 ta specjalna obsługa „ról” nie była przestrzegana bardzo konsekwentnie, a uprawnienia i role były często traktowane tak samo (jak np. Można zobaczyć w implementacji hasAuthority()
metody whasRole()
). Ze sprężyną Security 4, leczenie ról jest bardziej spójna i kod, który zajmuje się „ról” (jak RoleVoter
The hasRole
wyrażenie itd) zawsze dodaje ROLE_
prefiks dla Ciebie. Więc hasAuthority('ROLE_ADMIN')
oznacza to samo co hasRole('ADMIN')
ponieważ ROLE_
prefiks zostanie dodany automatycznie. Więcej informacji można znaleźć w przewodniku migracji zabezpieczeń wiosennych 3 do 4 .
Ale nadal: rola jest tylko autorytetem ze specjalnym ROLE_
prefiksem. Tak więc na wiosnę bezpieczeństwo 3 @PreAuthorize("hasRole('ROLE_XYZ')")
jest takie samo, @PreAuthorize("hasAuthority('ROLE_XYZ')")
a na wiosnę bezpieczeństwo 4 @PreAuthorize("hasRole('XYZ')")
jest takie samo jak @PreAuthorize("hasAuthority('ROLE_XYZ')")
.
Jeśli chodzi o przypadek użycia:
Użytkownicy mają role i role mogą wykonywać określone operacje.
Możesz skończyć GrantedAuthorities
dla ról, do których należy użytkownik i operacji, które rola może wykonywać. GrantedAuthorities
Dla ról mają prefiks ROLE_
i operacje mają prefiks OP_
. Przykładem mogą być działania władz OP_DELETE_ACCOUNT
, OP_CREATE_USER
, OP_RUN_BATCH_JOB
itp Role mogą być ROLE_ADMIN
, ROLE_USER
,ROLE_OWNER
itd.
Może się zdarzyć, że twoje jednostki zaimplementują się GrantedAuthority
tak jak w tym (pseudo-kodzie) przykładzie:
@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;
}
}
Identyfikatory ról i operacji tworzonych w bazie danych będzie reprezentacja GrantedAuthority, np ROLE_ADMIN
,OP_DELETE_ACCOUNT
itd. Gdy użytkownik jest uwierzytelniony, upewnij się, że wszystkie GrantedAuthorities wszystkich swoich ról i odpowiadające im operacje są zwracane z UserDetails.getAuthorities () metoda.
Przykład: Administrator rolę id ROLE_ADMIN
ma operacje OP_DELETE_ACCOUNT
, OP_READ_ACCOUNT
, OP_RUN_BATCH_JOB
przypisane do niego. Rola użytkownika o identyfikatorze ROLE_USER
ma operacjęOP_READ_ACCOUNT
.
Jeśli loguje admin w otrzymanej kontekście zabezpieczeń będzie mieć GrantedAuthorities:
ROLE_ADMIN
, OP_DELETE_ACCOUNT
, OP_READ_ACCOUNT
,OP_RUN_BATCH_JOB
Jeśli użytkownik loguje się, będzie to mieć
ROLE_USER
,OP_READ_ACCOUNT
UserDetailsService zadbałby o zebranie wszystkich ról i wszystkich operacji tych ról i udostępnienie ich za pomocą metody getAuthorities () w zwróconej instancji UserDetails.