1. O que é autenticação e autorização?
A autenticação é o processo de verificar a identidade de um usuário, enquanto a autorização é o processo de verificar se um usuário tem permissão para acessar um determinado recurso ou realizar uma determinada ação.
No Symfony, esses dois conceitos são tratados em conjunto com o componente de segurança. Este componente é responsável por gerenciar a autenticação e autorização em aplicativos.
2. Quais são os tipos de autenticação suportados pelo Symfony?
O Symfony suporta uma variedade de métodos de autenticação, incluindo:
HTTP Basic Authentication, Digest Authentication, X.509 Certificates, LDAP, OAuth, OpenID e Token-based Authentication.
Cada autenticação tem suas próprias configurações, mas o processo geral ainda é o mesmo.
3. Como funciona o processo de autenticação no Symfony?
O processo de autenticação no Symfony começa quando um usuário tenta acessar uma área protegida do aplicativo. O componente de segurança intercepta a solicitação, verifica se o usuário está autenticado e, se não estiver, redireciona-o para a página de login.
Depois que o usuário insere suas credenciais de login, o componente de segurança verifica essas informações e cria uma sessão de usuário para o usuário autenticado.
Se o processo de autenticação for bem-sucedido, o usuário será redirecionado de volta para a página que tentou acessar originalmente.
4. Como posso configurar a autenticação no Symfony?
Para configurar a autenticação no Symfony, é necessário definir a configuração do firewall no arquivo security.yaml
do seu projeto.
security:
firewalls:
main:
anonymous: ~
http_basic: ~
O exemplo acima mostra um firewall padrão chamado “principal” que usa autenticação HTTP básica e permite usuários anônimos.
5. Como posso proteger um recurso em um aplicativo Symfony?
Para proteger um recurso em um aplicativo Symfony, você precisa definir as regras de acesso para esse recurso na configuração do firewall no seu arquivo security.yaml
.
security:
access_control:
- { path: ^/admin, roles: ROLE_ADMIN }
- { path: ^/member, roles: ROLE_USER }
O exemplo acima protege dois caminhos diferentes em seu aplicativo. Os usuários que acessam a rota /admin
precisam ter a função ROLE_ADMIN
, enquanto aqueles que acessam a rota /member
precisam de ROLE_USER
.
6. Como posso personalizar a página de login padrão no Symfony?
Para personalizar a página de login padrão no Symfony, você precisa definir uma rota personalizada para a página de login e personalizar o template da página.
security:
firewalls:
main:
form_login:
login_path: app_login
check_path: app_login_check
O exemplo acima define a rota personalizada app_login
para a página de login. Para personalizar o template da página de login, você pode criar um novo template em seu diretório de templates e referenciá-lo na configuração do firewall.
7. Como posso personalizar as mensagens de erro de autenticação no Symfony?
Para personalizar as mensagens de erro de autenticação no Symfony, você precisa adicionar uma chave de tradução para cada mensagem que deseja personalizar em seu arquivo security.yaml
.
security:
firewalls:
main:
form_login:
login_path: app_login
check_path: app_login_check
username_label: 'E-mail:'
password_label: 'Senha:'
csrf_token_generator: security.csrf.token_manager
failure_path: app_login
failure_forward: true
failure_path_parameter: '_failure_path'
failure_handler: app.security.login_failure_handler
default_target_path: app_dashboard
use_referer: true
always_use_default_target_path: true
remember_me:
name: AppAuth
secret: '%kernel.secret%'
lifetime: 604800 # One week in seconds
path: /
domain: ~
secure: true # change it to true in production
http_only: true
remember_me_parameter: _remember_me
always_remember_me: true
update_identity: true
form:
type: AppFormSingInType
options:
credential_key: email
logout:
path: app_logout
target: app_login
Uma vez adicionada a chave de tradução, você pode personalizar o texto da mensagem em seu arquivo messages.(locale).yaml
.
8. Como posso usar o provedor de usuários no Symfony?
O provedor de usuários no Symfony é usado para recuperar informações de usuário de uma fonte externa, como um banco de dados ou um serviço. Para usar um provedor de usuários, você precisa configurá-lo na seção providers
do arquivo security.yaml
.
security:
providers:
app_user_provider:
entity:
class: AppEntityUser
property: email
in_memory:
memory:
users:
admin:
password: '$2y$13$4DUfpiGBTrQ0o7d0oGKHOuhz.KfB0gve3.xT6hoCG8J/DgP6IjuG6'
roles: ROLE_ADMIN
user:
password: '$2y$13$c/ShvQyWn7B002jJUr.oF.xfVAws69Z43KM7LzCrfqxuG9XcrISyK'
roles: ROLE_USER
O exemplo acima mostra dois provedores diferentes: um provedor baseado em entidade que lê usuários de um banco de dados e um provedor em memória que armazena usuários em uma matriz na memória.
9. Como posso adicionar campos personalizados à página de login no Symfony?
Para adicionar campos personalizados à página de login no Symfony, você precisa estender a classe AbstractFormLoginAuthenticator
e adicionar seus campos personalizados ao formulário de login.
class CustomAuthenticator extends AbstractFormLoginAuthenticator
{
public function getCredentials(Request $request)
{
$credentials = [
'email' => $request->request->get('email'),
'password' => $request->request->get('password'),
'custom_field' => $request->request->get('custom_field'),
];
return $credentials;
}
public function createFormBuilder(array $options): FormBuilderInterface
{
$formBuilder = parent::createFormBuilder($options);
$formBuilder->add('custom_field', TextType::class, [
'required' => true,
'label' => 'Custom Field',
]);
return $formBuilder;
}
}
O exemplo acima adiciona um campo personalizado chamado “custom_field” ao formulário de login. O valor inserido neste campo é incluído nos dados de credenciais retornados pelo método getCredentials()
.
10. Como posso usar o cache de autenticação no Symfony?
O cache de autenticação no Symfony permite armazenar informações de autenticação em cache para melhorar o desempenho de aplicativos que lidam com um grande volume de autenticações.
Para usar o cache de autenticação, você precisa configurá-lo na seção cache
do arquivo security.yaml
.
security:
firewalls:
main:
form_login:
login_path: app_login
check_path: app_login_check
logout:
path: app_logout
target: app_homepage
anonymous: true
guard:
authenticators:
- AppSecurityAuthenticatorTokenAuthenticator
remember_me:
secret: '%kernel.secret%'
lifetime: 31536000
path: /
access_denied_url: '/'
providers:
token_user_provider:
entity:
class: AppEntityUser
property: username
encoders:
AppEntityUser:
algorithm: bcrypt
cache:
enabled: true
provider: cache.security
O exemplo acima habilita o cache de autenticação usando o provider cache.security
.