Kısa cevap
Auth Provider kullanip kullanmamak size ve uygulamanızın ne kadar komplex olduğuna kalmış.
Uzun cevap
Auth sadece id vs şifre ile apiye istek atmak değildir. Birçok flow veya protokol ile işlenebilir.
Esneklik
- Farklı flowlar uygulayabilirsin ve bunları kolay bir şekilde yönetmek için Auth provider'a ihtiyaç duyarsın. Yinede spring security paketini kullanmak zorunda değilsin; Kendi yaklaşımını katabilirsin yada kendi frameworkunu de ekleyebilirsin bu konuda her hangi bir kısıtlama yok. Ancak elimize tekerlek verildi neden baştan icat edelim?
- Farkli durumlar için farkly Policy ler işlenebilir.
- Şifre politikaları: Özel algoritmalarla şifre doğrulama.
- Hesap durumu kontrolleri: Hesapları devre dışı bırakma, şifre sıfırlama zorunluluğu veya çoklu giriş denemelerini engelleme.
- Özel token doğrulama: JWT veya diğer token türlerini doğrulama.
Hem id ve şifre ile giriş yapabiliyoruz. Hemde github gibi OIDC sunucusu(Authority) veya keycloak veya IdentityServer gibi kaynaklar kullanarakta giriş yaptırabilirsiniz. Bunların her biri çok farklı flowlar içerebilir.
Forumdan örnek verirsek; Hem ID ve Şifre ile hemde Github ile giriş yapma imkanı sunuyor.
Güvenirlik
- Birden fazla provider kullanabilirsiniz. Biri
LDAP
veya SAML
ile doğrulama yapıyor, bir diğeri Active Directory
kullabilir
- Bir
AuthenticationProvider
başarısız oldu diyelim. Sıradaki Provideri deneyebilir.
Modülerlik
Bir AuthenticationProvider
` ı yenisi ile değiştirmek genel olarak uygulamanızın çalışma şeklini etkilemeyecektir.
Test edilebilirlik
Bence en önemli kısım bu. Auth sistemi domainden ayırmak daha kolay test seneryoları yazmayı kolaylaştırır. Örnek olarak AuthenticationProvider
` ın mock versiyonu yaratılıp farklı seneryolara farklı tepki vermesi sağlanabilir.
(S).O.L.I.D prensipleri
Dedicated auth provider kullanmak SOLID prensiplerinin S'sine (Single responsibility) denk geliyor. Uygulamadaki her obje tek bir amaca hizmet etmesi gerekiyor diye yorumlayabiliriz.
Örnek vermek gerekirse;
Birtane product servisiniz olduğunu varsayın. AuthenticationProvider
kullanmak yerine Product servisinde bu işlemi manuel olarak yapmak bu kavrama ters düşüyor.