Symfony 4 — Güvenlik Sistemi — HTTP Basic Login

Bu bölümde symfony güvenlik sisteminde yer alan güvenlik duvarı (firewall), erişim kontrolü (access control), parola şifreleme (password encoders), erişim sağlayıcıları (providers) özelliklerini inceleyeceğiz.

İlk olarak security-bundle paketinin var olup olmadığını kontrol edin.

composer require symfony/security-bundle

Diğer gerekli olan paket ise profiler yani sayfanın altında yer alacak olan toolbar.


composer require — dev symfony/profiler-pack

Profiler sayesinde başta performans, oturum bilgileri, aktif routelar, events ve hata ve uyarı kayıtları olmak üzere, projemizin hemen hemen tüm bilgilerine erişeceğiz.

(in memory) login:

Symfony güvenlik sistemindeki İlk deneyimimizi basit bir login işlemi yaparak gerçekleştireceğiz. Kullanıcı bilgilerini veritabanından sorgulamak yerine, bellekten okuyacağımız için security.yaml providers kısmını in_memory olarak tanımlıyoruz.

config/packages/ dizinindeki security.yaml dosyasını açıp, gerekli olan providers ayarlarını aşağıdaki gibi yapın:

providers:
in_memory:
memory:
users:
testuser:
password: test12345
roles: 'ROLE_USER'
admin:
password: admin12345
roles: 'ROLE_ADMIN'

Yukarıda basit bir login işlemi olacağını belirtmiştim. Aynı kararla devam edelim. Bu sebepten, HTML form kullanmak yerine HTTP basic authentication formunu çalıştıracağız. Bunun için security.yaml içerisinde bu özelliği aşağıdaki gibi aktif hale getirin:

firewalls:
dev:
pattern: ^/(_(profiler|wdt)|css|images|js)/
security: false
main:
anonymous: ~
http_basic: ~

Parolamızı şifrelemeden düz yazı olarak gireceğiz. Encoder yöntemini plaintext olarak ayarlayın.

encoders:
Symfony\Component\Security\Core\User\User: plaintext

security.yaml dosyasını son hali aşağıdaki gibi olmalıdır:

security:

# https://symfony.com/doc/current/security.html#where-do-users-come-from-user-providers
providers:
in_memory:
memory:
users:
testuser:
password: test12345
roles: 'ROLE_USER'
admin:
password: admin12345
roles: 'ROLE_ADMIN'

firewalls:
dev:
pattern: ^/(_(profiler|wdt)|css|images|js)/
security: false
main:
anonymous: ~
http_basic: ~


encoders:
Symfony\Component\Security\Core\User\User: plaintext

Login işleminden sonra erişilecek adres /admin olsun. Bunun için İlgili controller fonksiyonunu oluşturup route tanımlayın.

class DefaultController extends AbstractController
{

/**
*
@Route("/admin")
*/
public function
admin()
{
return new
Response('<html><body>Admin page!</body></html>');
}


}

Admin sayfasına dışarıdan erişilmemesi gerektiğinden, ilgili route için erişim kısıtlaması getiriyoruz. security.yaml içerisinde, access_control kısmında bu kısıtlamayı aşağıdaki gibi belirtin.


access_control:
- { path: ^/login, roles: IS_AUTHENTICATED_ANONYMOUSLY }
- { path: ^/admin, roles: ROLE_ADMIN }

Artık giriş yapabilirsiniz.

HTTP doğrulama sisteminde logout özelliği olmadığından tarayıcınızın ön belleğini temizlemeyi unutmayın.