12 Aralık 2019 Perşembe

SpringSecurity @PreAuthorize Anotasyonu - MethodSecurity Kavramı

Giriş
Yetkilendirme için kullanılır. Metodların üstüne eklenir. Kodun "Authenticated user" tarafından çağrılmasını sağlar. @Service, @RestController gibi sınıflar ile birlikte kullanılabilir.

Metoda girmeden önce çalışır. Açıklaması şöyle.
The @PreAuthorize as name suggest can check for authorization before entering into method. The @PreAuthorize authorizes on the basis of role or the argument which is passed to the method.
Sanırım bu anotasyonun çalışması için WebSecurityConfigurerAdapter sınıfına  @EnableGlobalMethodSecurity(prePostEnabled = true) yapılması gerekir.

Bu anotasyonun kardeşi @PostAuthorize.

Bu anotasyon yerine kendimiz de AOP ile yetkilendirme yapabiliriz. Bir örnek burada

hasXX() Kontrolleri - Derleme Zamanı İsimler
Açıklaması şöyle.
That implies that we know all possible roles, permissions, etc at compile time.
hasPermission(), hasRole(), hasAuthority() gibi security expressionları destekler.

Kontrol Başarısız İse
Açıklaması şöyle
If this authority is missing then 403 Forbidden will be returned.
Metin Yerine Enum Kullanma
hasXX() metodları içine verilen metin yerine Enum kullanılabilir. 
Örnek
Şöyle yaparız
@PreAuthorize("hasAuthority(T(com.example.SecurityAuthorities).USER)")
@GetMapping("...", produces = MediaType.APPLICATION_JSON_VALUE)
@ResponseStatus(OK)
public ResponseEntity<GetExpensesResponseDto> getExpenses(){
  ...
}
Sadece Bean Sınıfılarda Kullanılabilir
Açıklaması şöyle.
The annotated methods will only be secured for instances which are defined as Spring beans (in the same application context in which method-security is enabled).
hasPermission() Security Expression Kullanımı
hasPermission() metodu PermissionEvaluator arayüzünden gelir.

Örnek
Şöyle yaparız.
@PreAuthorize("hasPermission(object, permission)")
public void someMethod(...);
hasRole() Security Expression Kullanımı
Örnek
Şöyle yaparız.
@RestController
public class TestController {

  @GetMapping("/public")
  public String testPublic(){
    return "Welcome to the public place";
  }

  @GetMapping("/private")
  @PreAuthorize("hasRole('USER')")
  public String testPrivate(){
    return "Welcome to the private place";
  }

  @GetMapping("/admin")
  @PreAuthorize("hasRole('ADMIN')")
  public String testAdmin(){
    return "Welcome to the admin place";
  }

}
Örnek - hasRole ve or
Elimde şöyle bir kod olsun
@Service
public class SomeService {

  public void findOne(Long id) {
    ...
  }
}
Şöyle yaparız.
@PreAuthorize(hasRole('ROLE_VIEWER') or hasRole('ROLE_EDITOR') or
  #id == authentication.principal.username"")
Örnek
Şöyle yaparız.
@PreAuthorize("hasRole('ROLE_A') or hasRole('ROLE_B')")
public void yourMethod() {
    // ...
}
Kendi Security Expression Metodumuz
- Eğer kendi security expression'ımızı yazmak istersek SecurityExpressionRoot sınıfından kalıtmamız gerekir. Kendi security expression sınıfımı GlobalMethodSecurityConfiguration sınıfına tanıtmak gerekir.
Örnek
Kendi custom security metodumu çağırmak için şöyle yaparız
@PreAuthorize("isProfileOwner(#id)")
@GetMapping("{id}")
public String show(@PathVariable("id") Long id, Model model) {
//omitted
}

Hiç yorum yok:

Yorum Gönder