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 RoleVoterThe hasRolewyraż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ć GrantedAuthoritiesdla ról, do których należy użytkownik i operacji, które rola może wykonywać. GrantedAuthoritiesDla 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_JOBitp Role mogą być ROLE_ADMIN, ROLE_USER,ROLE_OWNER itd.
Może się zdarzyć, że twoje jednostki zaimplementują się GrantedAuthoritytak 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_ADMINma operacje OP_DELETE_ACCOUNT, OP_READ_ACCOUNT, OP_RUN_BATCH_JOBprzypisane do niego. Rola użytkownika o identyfikatorze ROLE_USERma 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.