Como personalizar o seu Formulário de Login¶
Usar um formulário de login para autenticação é é um método comum e flexível para lidar com a autenticação no Symfony2. Praticamente todos os aspectos do formulário de login podem ser personalizados. A configuração padrão completa é mostrada na próxima seção.
Configuração de Referência do Formulário de Login¶
- YAML
# app/config/security.yml security: firewalls: main: form_login: # the user is redirected here when he/she needs to login login_path: /login # if true, forward the user to the login form instead of redirecting use_forward: false # submit the login form here check_path: /login_check # by default, the login form *must* be a POST, not a GET post_only: true # login success redirecting options (read further below) always_use_default_target_path: false default_target_path: / target_path_parameter: _target_path use_referer: false # login failure redirecting options (read further below) failure_path: null failure_forward: false # field names for the username and password fields username_parameter: _username password_parameter: _password # csrf token options csrf_parameter: _csrf_token intention: authenticate
- XML
<!-- app/config/security.xml --> <config> <firewall> <form-login check_path="/login_check" login_path="/login" use_forward="false" always_use_default_target_path="false" default_target_path="/" target_path_parameter="_target_path" use_referer="false" failure_path="null" failure_forward="false" username_parameter="_username" password_parameter="_password" csrf_parameter="_csrf_token" intention="authenticate" post_only="true" /> </firewall> </config>
- PHP
// app/config/security.php $container->loadFromExtension('security', array( 'firewalls' => array( 'main' => array('form_login' => array( 'check_path' => '/login_check', 'login_path' => '/login', 'user_forward' => false, 'always_use_default_target_path' => false, 'default_target_path' => '/', 'target_path_parameter' => _target_path, 'use_referer' => false, 'failure_path' => null, 'failure_forward' => false, 'username_parameter' => '_username', 'password_parameter' => '_password', 'csrf_parameter' => '_csrf_token', 'intention' => 'authenticate', 'post_only' => true, )), ), ));
Redirecionando após Sucesso¶
Você pode alterar o local para onde o formulário de login redireciona após um login bem-sucedido
usando opções de configuração diferentes. Por padrão, o formulário irá redirecionar para a URL
solicitada pelo usuário (ou seja, a URL que acionou o formulário de login que está sendo exibido).
Por exemplo, se o usuário solicitou http://www.example.com/admin/post/18/edit
, então, após
o login bem-sucedido, ele será enviado de volta para http://www.example.com/admin/post/18/edit
. Isto é feito através do armazenamento da URL solicitada
em sessão. Se nenhuma URL estiver presente na sessão (talvez o usuário acessou
diretamente a página de login), então, o usuário é redirecionado para a página padrão,
que é /
(ou seja, a homepage). Você pode alterar esse comportamento
de várias formas.
Nota
Como mencionado, por padrão, o usuário é redirecionado para a página que ele solicitou originalmente. Às vezes, isso pode causar problemas, como, por exemplo, uma requisição AJAX em background “aparece” sendo a última URL visitada, fazendo com que o usuário seja redirecionado para lá. Para informações sobre como controlar esse comportamento, consulte /cookbook/security/target_path.
Alterando a Página Padrão¶
Primeiro, a página padrão pode ser definida (ou seja, a página para a qual o usuário será
redirecionado se nenhuma página anterior foi armazenada em sessão). Para configurá-la para
/admin
use a seguinte configuração:
- YAML
# app/config/security.yml security: firewalls: main: form_login: # ... default_target_path: /admin
- XML
<!-- app/config/security.xml --> <config> <firewall> <form-login default_target_path="/admin" /> </firewall> </config>
- PHP
// app/config/security.php $container->loadFromExtension('security', array( 'firewalls' => array( 'main' => array('form_login' => array( ..., 'default_target_path' => '/admin', )), ), ));
Agora, quando não houver uma URL definida na sessão, os usuários serão enviados para /admin
.
Sempre Redirecionar para a Página Padrão¶
Você pode fazer com que os usuários sejam sempre redirecionados para a página padrão,
independentemente da URL que eles tenham solicitado anteriormente, definindo a
a opção always_use_default_target_path
para true:
- YAML
# app/config/security.yml security: firewalls: main: form_login: # ... always_use_default_target_path: true
- XML
<!-- app/config/security.xml --> <config> <firewall> <form-login always_use_default_target_path="true" /> </firewall> </config>
- PHP
// app/config/security.php $container->loadFromExtension('security', array( 'firewalls' => array( 'main' => array('form_login' => array( ..., 'always_use_default_target_path' => true, )), ), ));
Usando a URL de referência (Referring URL)¶
No caso de nenhuma URL anterior estar armazenada em sessão, você pode desejar usar
o HTTP_REFERER
no lugar, pois este, muitas vezes, é o mesmo. Você pode fazer
isso configurando o use_referer
para true (o padrão é false):
- YAML
# app/config/security.yml security: firewalls: main: form_login: # ... use_referer: true
- XML
<!-- app/config/security.xml --> <config> <firewall> <form-login use_referer="true" /> </firewall> </config>
- PHP
// app/config/security.php $container->loadFromExtension('security', array( 'firewalls' => array( 'main' => array('form_login' => array( ..., 'use_referer' => true, )), ), ));
Novo na versão 2.1: A partir da versão 2.1, se o referer for igual à opção login_path
,
o usuário será redirecionado para default_target_path
.
Controlando a URL de redirecionamento dentro do Formulário¶
Você também pode sobrescrever para onde o usuário será redirecionado, através do próprio
formulário incluindo um campo oculto com o nome _target_path
. Por exemplo, para
redirecionar para a URL definida por rota account
, use o seguinte:
- Twig
{# src/Acme/SecurityBundle/Resources/views/Security/login.html.twig #} {% if error %} <div>{{ error.message }}</div> {% endif %} <form action="{{ path('login_check') }}" method="post"> <label for="username">Username:</label> <input type="text" id="username" name="_username" value="{{ last_username }}" /> <label for="password">Password:</label> <input type="password" id="password" name="_password" /> <input type="hidden" name="_target_path" value="account" /> <input type="submit" name="login" /> </form>
- PHP
<!-- src/Acme/SecurityBundle/Resources/views/Security/login.html.php --> <?php if ($error): ?> <div><?php echo $error->getMessage() ?></div> <?php endif; ?> <form action="<?php echo $view['router']->generate('login_check') ?>" method="post"> <label for="username">Username:</label> <input type="text" id="username" name="_username" value="<?php echo $last_username ?>" /> <label for="password">Password:</label> <input type="password" id="password" name="_password" /> <input type="hidden" name="_target_path" value="account" /> <input type="submit" name="login" /> </form>
Agora, o usuário será redirecionado para o valor do campo oculto do formulário. O
valor do atributo pode ser um caminho relativo, uma URL absoluta, ou um nome de rota.
Você pode até mesmo alterar o nome do campo oculto do formulário, alterando a opção
target_path_parameter
para um outro valor.
- YAML
# app/config/security.yml security: firewalls: main: form_login: target_path_parameter: redirect_url
- XML
<!-- app/config/security.xml --> <config> <firewall> <form-login target_path_parameter="redirect_url" /> </firewall> </config>
- PHP
// app/config/security.php $container->loadFromExtension('security', array( 'firewalls' => array( 'main' => array('form_login' => array( 'target_path_parameter' => redirect_url, )), ), ));
Redirecionando quando o Login Falhar¶
Além de redirecionar o usuário após um login bem-sucedido, você também pode definir a URL que o usuário deve ser redirecionado após uma falha de login (por exemplo, quando um nome de usuário ou senha inválida foi submetida). Por padrão, o usuário é redirecionado de volta ao formulário de login. Você pode definir isso para uma URL diferente com a seguinte configuração:
- YAML
# app/config/security.yml security: firewalls: main: form_login: # ... failure_path: /login_failure
- XML
<!-- app/config/security.xml --> <config> <firewall> <form-login failure_path="login_failure" /> </firewall> </config>
- PHP
// app/config/security.php $container->loadFromExtension('security', array( 'firewalls' => array( 'main' => array('form_login' => array( ..., 'failure_path' => login_failure, )), ), ));