Introdução
A autenticação e autorização são dois elementos importantes em sistemas de segurança em aplicativos Symfony. Com a autenticação, você garante que o usuário que está acessando a aplicação é realmente quem ele diz ser. Já a autorização garante que somente usuários com permissões específicas possam acessar determinadas áreas da aplicação.
Autenticação no Symfony
Em uma aplicação Symfony, é possível utilizar diversos tipos de autenticação, desde o básico login/senha (form-based authentication) até autenticação com tokens (token-based authentication). Para implementar a autenticação na sua aplicação, é necessário definir um “guard” que será responsável por, de fato, realizar a autenticação do usuário.
Para definir um guard, é necessário criar uma classe que implemente a interface “GuardAuthenticatorInterface”. Essa classe deve conter dois métodos: “getCredentials()” e “getUser()”. No método “getCredentials()”, você deve extrair as credenciais do usuário (ex: login e senha) a partir do request enviado pelo cliente. Já no método “getUser()”, você deve buscar o usuário a partir das credenciais informadas pelo cliente.
```
class LoginFormAuthenticator implements GuardAuthenticatorInterface
{
public function getCredentials(Request $request)
{
$credentials = [
'username' => $request->request->get('username'),
'password' => $request->request->get('password'),
'csrf_token' => $request->request->get('_csrf_token'),
];
// Verifica CSRF token...
return $credentials;
}
public function getUser($credentials, UserProviderInterface $userProvider)
{
$username = $credentials['username'];
return $userRepository->findOneBy(['username' => $username]);
}
}
```
Após criar a classe que implementa a interface “GuardAuthenticatorInterface”, é necessário configurar o firewall da aplicação para utilizar o guard criado. Para isso, basta adicionar as seguintes linhas de código no arquivo “security.yaml”:
```
security:
firewalls:
main:
anonymous: true
guard:
authenticators:
- AppSecurityLoginFormAuthenticator
logout:
path: app_logout
target: /
```
Nesse exemplo, é criado um firewall chamado “main” que utiliza o guard “LoginFormAuthenticator”. Caso o usuário tente acessar alguma área que exige autenticação, ele será redirecionado para a página de login.
Autorização no Symfony
Já na autorização, é possível utilizar diversas estratégias para definir quais usuários têm acesso a quais áreas da aplicação. É possível utilizar roles para definir as permissões de um usuário (ex: ROLE_USER, ROLE_ADMIN), utilizar voters para definir regras de acesso mais granulares (ex: somente o próprio usuário pode editar seu perfil) ou utilizar annotations no controller para definir permissões específicas.
Para utilizar as annotations no controller, basta adicionar as seguintes linhas de código no arquivo “security.yaml”:
```
security:
enable_annotations: true
access_control:
- { path: ^/, roles: IS_AUTHENTICATED_ANONYMOUSLY }
```
Com essa configuração, é possível utilizar as seguintes annotations no controller:
```
// Ação do controller que somente pode ser acessada por usuários autenticados
/**
* @IsGranted("ROLE_USER")
*/
public function minhaAcao()
{
// ...
}
// Ação do controller que somente pode ser acessada pelo próprio usuário
/**
* @IsGranted("IS_AUTHENTICATED_FULLY")
* @param int $id
*/
public function minhaAcao($id)
{
$usuario = $this->getDoctrine()->getRepository(Usuario::class)->find($id);
$this->denyAccessUnlessGranted('editar', $usuario);
// ...
}
```
Nesses exemplos, foi utilizado a metodologia “declarative security”, ou seja, a definição da autorização é realizada no próprio código. No entanto, é possível utilizar a metodologia “voter-based security”, onde as regras de autorização são definidas em uma classe que implementa a interface “VoterInterface”. Essa classe é responsável por avaliar se um usuário possui acesso a determinado recurso e, caso não possua, bloquear o acesso.
Conclusão
Com a utilização da autenticação e autorização, é possível proteger sua aplicação Symfony de acessos maliciosos e garantir a segurança dos dados dos seus usuários. Utilizando as estratégias apresentadas neste artigo, sua aplicação estará mais segura e preparada para lidar com diversos tipos de usuários.