Bir GrantedAuthority'yi bir "izin" veya "hak" olarak düşünün. Bu "izinler" (normal olarak) dize ( getAuthority()
yöntemle) olarak ifade edilir . Bu dizeler izinleri tanımlamanıza ve seçmenlerinizin bir şeye erişim izni verip vermediklerine karar vermelerine izin verir.
Kullanıcılara güvenlik bağlamına koyarak farklı GrantedAuthority'ler (izinler) verebilirsiniz. Bunu normalde gerekli GrantedAuthorities döndüren bir UserDetails uygulaması döndüren kendi UserDetailsService uygulayarak yaparsınız.
Roller (birçok örnekte kullanıldığı gibi), bir rolün önekle başlayan bir GrantedAuthority olduğunu söyleyen bir adlandırma kuralına sahip "izinlerdir" ROLE_
. Başka bir şey yok. Bir rol sadece bir GrantedAuthority - bir "izin" - bir "hak" tır. Bahar güvenliğinde, ROLE_
öneki rolünün özellikle ROLE_
önekin varsayılan olarak kullanıldığı RoleVoter'da olduğu gibi ele alındığı birçok yer görürsünüz . Bu, rol adlarını ROLE_
önek ile vermenizi sağlar . Bahar güvenliğinden 4 önce, "rollerin" bu özel muamelesi çok tutarlı bir şekilde takip edilmemiştir ve yetkililer ve roller genellikle aynı şekilde ele alınmıştır (örn.hasAuthority()
hasRole()
). Bahar Güvenlik 4 ile rollerin tedavi "rolleri" ile fırsatlar (gibi o daha tutarlı ve kodudur RoleVoter
, hasRole
ifade vs) her zaman ekler ROLE_
sizin için önek. Yani hasAuthority('ROLE_ADMIN')
aynı anlamda hasRole('ADMIN')
çünkü ROLE_
önek otomatik olarak eklenir. Daha fazla bilgi için yay güvenliği 3 ila 4 geçiş kılavuzuna bakın.
Ama yine de: bir rol sadece özel bir ROLE_
öneki olan bir otoritedir . Yani Bahar güvenliği 3 @PreAuthorize("hasRole('ROLE_XYZ')")
ile aynıdır @PreAuthorize("hasAuthority('ROLE_XYZ')")
ve Bahar güvenliği 4 @PreAuthorize("hasRole('XYZ')")
ile aynıdır @PreAuthorize("hasAuthority('ROLE_XYZ')")
.
Kullanım durumunuzla ilgili:
Kullanıcıların rolleri vardır ve roller belirli işlemleri gerçekleştirebilir.
GrantedAuthorities
Bir kullanıcının ait olduğu roller ve bir rolün gerçekleştirebileceği işlemler için sonuç alabilirsiniz. GrantedAuthorities
Roller için ön eki ROLE_
ve operasyon ön eki OP_
. Operasyon makamları olabilir için bir örnek OP_DELETE_ACCOUNT
, OP_CREATE_USER
, OP_RUN_BATCH_JOB
vb Rolleri olabilir ROLE_ADMIN
, ROLE_USER
, ROLE_OWNER
vb
GrantedAuthority
Varlıklarınızın bu (sözde kod) örneğinde olduğu gibi uygulanmasını sağlayabilirsiniz :
@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;
}
}
Veritabanınızda oluşturmak roller ve operasyonların kimlikleri GrantedAuthority temsilini, örneğin olurdu ROLE_ADMIN
, OP_DELETE_ACCOUNT
) (Bir kullanıcı teyid edildiğinde vb nokta bütün rollerin tüm GrantedAuthorities ve ilgili işlemleri UserDetails.getAuthorities döndü emin olun yöntem.
Örnek: kimliğine sahip yönetici rolü ROLE_ADMIN
operasyonları vardır OP_DELETE_ACCOUNT
, OP_READ_ACCOUNT
, OP_RUN_BATCH_JOB
kendisine atanmış. Kimliğine ROLE_USER
sahip kullanıcı rolünün işlemi vardır OP_READ_ACCOUNT
.
Ortaya çıkan güvenlik bağlamında bir yönetici günlükleri GrantedAuthorities olacaksa:
ROLE_ADMIN
, OP_DELETE_ACCOUNT
, OP_READ_ACCOUNT
,OP_RUN_BATCH_JOB
Bir kullanıcının giriş yaparsa, bu sahip olacaktır:
ROLE_USER
,OP_READ_ACCOUNT
UserDetailsService, bu rollerin tüm rollerini ve tüm işlemlerini toplamaya ve bunları döndürülen UserDetails örneğinde getAuthorities () yöntemiyle kullanılabilir hale getirmeye özen gösterir.