14 Şubat 2020 Cuma

SpringSecurity GrantedAuthority Arayüzü - Kullanıcının Sahip Olduğu Rol Anlamına Gelir

Giriş
Şu satırı dahil ederiz
import org.springframework.security.core.GrantedAuthority;
Açıklaması şöyle.
Once the user is authenticated, we need to get the granted authorities for the user and set them. For that, we need a custom class to represent the granted authorities.
Açıklaması şöyle
- The main interface that represents our user is UserDetails.
- The main interface for defining user’s permission is GrantedAuthority.
- The main interface that is used by authentication mechanisms for retrieving user is UserDetailsService
- For configuring mentioned above authentication mechanisms we just need to override some methods of WebSecurityConfigurerAdapter abstract class
Rol Tabanlı Yetkilendirme
Bazı durumlarda rol tabanlı yetkilendirme yetersiz kalıyor.

Örnek
Elimizde bir kullanıcı rolü olsun. Bazı kullanıcılara yazıcıya erişim hakkı verelim. Bazılarına vermeyelim. Bu durumda rol tabanlı yetkilendirme yetersiz kalıyor.

Örnek
Elimizde iki tane takım olsun. Takımlara Kırmızı ve Mavi diye renk verelim. Her takımda üç tane rol olsun.

1. Eğitmen Rolü
2. Öğrenci Rolü
3. İzleyici.Rolü

Rollerin yetkileri şöyle olsun
- Eğitmen rolündeki kişiler her iki takımdaki tüm öğrencileri görebilsinler.
- Öğrenciler sadece kendi takım arkadaşlarını görebilsinler
- İzleyiciler herkesi görebilsinler.

Bu durumda iki numaralı yetki sadece role bakarak gerçekleştirilemez çünkü öğrenci rolü yanında bir de taraf bilgisini de bilmek gerekir.

Çözüm olarak rollerin haklara (privilege) göre daha da bölünmesi yapılabilir. Ancak bence "rol + hak" tabanlı bir çözüm daha kolay.

Örnek
Şöyle yaparız.
public class CustomAuthority implements GrantedAuthority {

  private String role;

  public CustomAuthority(String role) {
    this.role = role;
  }

  @Override
  public String getAuthority() {
    return role;
  }
}
Bu nesneyi kullanmak için şöyle yaparız.
// make the database call, get roles for the user
List<String> roles = <db call to get roles>
authentication.setAuthorities(Collections.unmodifiableCollection(roles.stream()
  .map(CustomAuthority::new).collect(Collectors.toList()));
SecurityContextHolder.getContext().setAuthentication(authentication);

Hiç yorum yok:

Yorum Gönder