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, hasRoleifade 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.
GrantedAuthoritiesBir kullanıcının ait olduğu roller ve bir rolün gerçekleştirebileceği işlemler için sonuç alabilirsiniz. GrantedAuthoritiesRoller 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_JOBvb Rolleri olabilir ROLE_ADMIN, ROLE_USER, ROLE_OWNERvb
GrantedAuthorityVarlı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_ADMINoperasyonları vardır OP_DELETE_ACCOUNT, OP_READ_ACCOUNT, OP_RUN_BATCH_JOBkendisine atanmış. Kimliğine ROLE_USERsahip 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.