Symfony Authentication Nasıl Yapılır ?

Murat Çakmak
2 min readJun 12, 2022

--

Symfony auth yapısını sihirbazlıkların içinde benim gibi kaybolmuş olabilirsiniz. Symfony authentication bazı sihirbaz kodlarla ve security.yml bir kaç ayarlama yaparak hızlıca çözeceğiz.

symfony authentication nasıl yapılır

Öncelikle bir örneği yapılmış olan github todo & auth uygulamasına buradan bakabilirsiniz.
https://github.com/muratcakmaksoftware/todo-symfony

Şimdi bir auth uygulamasını sıfırdan yapalım:

User modelini oluşturma

php bin/console make:userThe name of the security user class (e.g. User) [User]:
> User
Do you want to store user data in the database (via Doctrine)? (yes/no) [yes]:
> yes
Enter a property name that will be the unique "display" name for the user (e.g.
email, username, uuid [email]
> email
Does this app need to hash/check user passwords? (yes/no) [yes]:
> yes
created: src/Entity/User.php
created: src/Repository/UserRepository.php
updated: src/Entity/User.php
updated: config/packages/security.yaml

Veritabani bağlantısını .env den ayarladıktan sonra migration çalıştırma

//Migration dosyasını oluşturur.
php bin/console make:migration
//Migration dosyasını çalıştırır.
php bin/console doctrine:migrations:migrate

Login Formunu otomatik oluşturma

php bin/console make:authWhat style of authentication do you want? [Empty authenticator]:
[0] Empty authenticator
[1] Login form authenticator
> 1
The class name of the authenticator to create (e.g. AppCustomAuthenticator):
> AppCustomAuthenticator
Choose a name for the controller class (e.g. SecurityController) [SecurityController]:
> SecurityController
Do you want to generate a '/logout' URL? (yes/no) [yes]:
> yes
created: src/Security/AppCustomAuthenticator.php
updated: config/packages/security.yaml
created: src/Controller/SecurityController.php
created: templates/security/login.html.twig

Otomatik oluşturulan dosyaları inceleyiniz

  • Buradaki AppCustomAuthenticator
    security.yml içerisine
    custom_authenticator: App\Security\AppCustomAuthenticator otomatik eklenmektedir.
  • Login sayfasında login olurken AppCustomAuthenticator’deki authenticate() fonksiyonu tetiklenecektir.
  • SecurityController’da ise otomatik olarak login ve logout fonksiyonları oluşmaktadır.

Register Formunu otomatik oluşturma

/var/www # Creating a registration form for App\Entity\UserDo you want to add a @UniqueEntity validation annotation on your User class to make sure duplicate accounts aren't created? (yes/no) [yes]:
> yes
Do you want to send an email to verify the user's email address after registration? (yes/no) [yes]:
> no
Do you want to automatically authenticate the user after registration? (yes/no) [yes]:
> yes
updated: src/Entity/User.php
created: src/Form/RegistrationFormType.php
created: src/Controller/RegistrationController.php
created: templates/registration/register.html.twig
  • RegistrationController içerisinde register fonksiyonu oluşturmaktadır.
    RegistrationFormType ile php ile form oluşturulur.
  • RegistrationFormType daki validation da belirleyebiliriz ancak belirtilmemiş ise default olarak model de arar.

Security.yml konfigürasyon edilmesi

firewalls:
dev:
pattern: ^/(_(profiler|wdt)|css|images|js)/
security: false
main:
lazy: true
provider: app_user_provider

#Login(AuthenticationUtils yada admin url algıladığı için) ve Register(belirtildiği için) de otomatik tetiklenir
custom_authenticator: App\Security\AppCustomAuthenticator
logout:
path: app_admin_logout
#Logout olunduysa yönlendirilecek route_name
target: app_admin_login

access_control:
- { path: '^/admin/login', roles: PUBLIC_ACCESS }
- { path: '^/admin/register', roles: PUBLIC_ACCESS }

#IS_AUTHENTICATED_FULLY login olan kullanıcının rolü önemli değilse kullanılır bunun yerine ROLE_USER tüm login olan kişilere verdiğiniz bir rolü'de kullanabiliriz.
- { path: '^/admin', roles: [ IS_AUTHENTICATED_FULLY, ROLE_USER, ROLE_ADMIN ] }

access_control ayarlamalara dikkat edersek.
PUBLIC_ACCESS tüm anonim user’lar için erişim iznini belirttik.
IS_AUTHENTICATED_FULLY ise rolu ne olursa olsun fark etmez giriş yapabilir dedik.
logout ise target ile logout olduktan sonra yönlendirileceği route belirttik.

Umarım faydalı olmuştur daha fazla bilgi için kaynakçaları inceleyebilirsiniz.
Takipte kalmayı unutmayın :)

Kaynakça:
https://symfony.com/doc/current/security.html

İşe yarayabilecek alternatif kaynakça:
https://symfony.com/doc/3.2/security/guard_authentication.html

--

--