Symfony Authentication Nasıl Yapılır ?
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.
Ö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]:
> UserDo you want to store user data in the database (via Doctrine)? (yes/no) [yes]:
> yesEnter a property name that will be the unique "display" name for the user (e.g.
email, username, uuid [email]
> emailDoes this app need to hash/check user passwords? (yes/no) [yes]:
> yescreated: 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
> 1The class name of the authenticator to create (e.g. AppCustomAuthenticator):
> AppCustomAuthenticatorChoose a name for the controller class (e.g. SecurityController) [SecurityController]:
> SecurityControllerDo you want to generate a '/logout' URL? (yes/no) [yes]:
> yescreated: 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]:
> yesDo you want to send an email to verify the user's email address after registration? (yes/no) [yes]:
> noDo you want to automatically authenticate the user after registration? (yes/no) [yes]:
> yesupdated: 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