Anıl Şenocak
@PreAuthorize, @RolesAllowed ve @Secured öğelerinin tümü, method güvenliğini yapılandırmaya izin veren annotationlardır. Hem bireysel metodlara hem de sınıf düzeyinde uygulanabilirler Method düzeyinde güvenlik, Spring AOP proxies'leri kullanılarak gerçekleştirilir.
Spring Security 3 ile birlikte @PreAuthorize and @PostAuthorize desteklemiştir.
Spring Expression Language (SpEL) kullanılarak bir metoda erişim kısıtlamalarının belirlenmesine olanak tanır. Bu kısıtlamalar, metod yürütülmeden önce değerlendirilir ve kısıtlamalar yerine getirilmezse, metodun yürütülmesinin reddedilmesine neden olabilir.
Spring Security framework'ün bir parçasıdır. Kullanabilmek için @EnableGlobalMethodSecurity annotationdaki prePostEnabled özniteliğinin true olarak ayarlanması gerekir:
@EnableGlobalMethodSecurity(prePostEnabled=true)
@PreAuthorize("hasRole('ROLE_VIEWER') or hasRole('ROLE_EDITOR')") // OR, AND olabilir
public boolean isValidUsername(String username) {}
Kaynağı, JSR-250 Java güvenlik standardındadır. Bu açıklama, yalnızca rol tabanlı güvenliği desteklediğinden @PreAuthorize ek açıklamasından daha sınırlıdır. Kullanmak için, bu açıklamayı içeren kitaplığın, Spring Security'nin bir parçası olmadığı için sınıf yolunda olması gerekir. Ek olarak, @EnableGlobalMethodSecurity ek açıklamasının jsr250Enabled özniteliğinin true olarak ayarlanması gerekir:
@EnableGlobalMethodSecurity(jsr250Enabled=true)
@RolesAllowed({ "ROLE_VIEWER", "ROLE_EDITOR" }) // OR ile seçilir
public boolean isValidUsername(String username) {
//...
}
Metod güvenliğini yapılandırmak için kullanılabilen eski bir Spring Security 2 annotationdır. Rol tabanlı güvenlikten fazlasını destekler, ancak güvenlik kısıtlamalarını belirtmek için Spring Expression Language (SpEL) kullanımını desteklemez. Yeni uygulamalarda @PreAuthorize notunun bu anotasyon üzerinden kullanılması tavsiye edilir. Kullanılması için @EnableGlobalMethodSecurity ek açıklamasında securedEnabled özniteliği etkinleştirilmesi gerekir:
@EnableGlobalMethodSecurity(securedEnabled=true)
@Secured("ROLE_ADMIN") annotation ile @PreAuthorize("hasRole('ROLE_ADMIN')") aynıdır ancak @Secured({"ROLE_USER","ROLE_ADMIN") ROLE_USER VEYA ROLE_ADMIN olarak işlenir. VE operatörünü desteklemiyor.
@Secured ve @RolesAllowed aynı şeyi ifade eder ve farkı @Secured Spring'e özel bir annotationdır ancak @RolesAllowed Java standard annotationdır(JSR250).
@Secured({ "ROLE_VIEWER", "ROLE_EDITOR" }) // OR ile seçilir
public boolean isValidUsername(String username) {
return userRoleRepository.isValidUsername(username);
}
Metodu çalıştırmadan önce bir koleksiyon bağımsız değişkenini filtrelemek için @PreFilter annotation'ı kullanılır:
@PreFilter("filterObject != authentication.principal.username")
public String joinUsernames(List<String> usernames) {
return usernames.stream().collect(Collectors.joining(";"));
}
Bu örnekte, kimliği doğrulanan kullanıcı dışındaki tüm kullanıcı adlarını birleştiriyoruz. Burada, ifademizde, koleksiyondaki mevcut nesneyi temsil etmek için filterObject adını kullanıyoruz. Ancak, metodun bir koleksiyon türü olan birden fazla argümanı varsa, hangi argümanı filtrelemek istediğimizi belirtmek için filterTarget özelliğini kullanmamız gerekir:
@PreFilter(value = "filterObject != authentication.principal.username", filterTarget = "usernames")
public String joinUsernamesAndRoles(List<String> usernames, List<String> roles) {
return usernames.stream().collect(Collectors.joining(";")) + ":" + roles.stream().collect(Collectors.joining(";"));
}
Aşağıdaki tablo, Spring Security 5 ile kullanılabilen güvenlik annotationlarının Spring Expression Language desteğini göstermektedir:
| Security Annotation | SpEL Desteği |
|---|---|
| @PreAuthorize | EVET |
| @PostAuthorize | EVET |
| @PreFilter | EVET |
| @PostFilter | EVET |
| @Secured | HAYIR |
| @RolesAllowed | HAYIR |