Helper controlador Auth
1Apresentação
Este helper é usado para gerenciar a autenticação dos usuários do site. Ele é, ao mesmo tempo, o controlador que fornece a interface de autenticação e o plugin que transmite as informações de autenticação para outros plugins/controladores.
O sistema de autenticação proposto é sem senha: o usuário informa seu endereço de e-mail, e, se ele for conhecido no banco de dados, uma mensagem é enviada para esse endereço, contendo um link. Ao clicar no link, o usuário retorna ao site já autenticado. O link só pode ser usado uma vez e tem um tempo de vida limitado a uma hora.
Por padrão, o controlador só aceita conexões de usuários que já foram adicionados ao banco de dados. No entanto, é possível configurá-lo para que novos usuários sejam registrados na primeira vez que informarem seu endereço de e-mail.
2Banco de dados
Este helper requer duas tabelas no banco de dados, uma chamada User (contendo as informações dos usuários), e outra chamada AuthToken (contendo os tokens de conexão enviados por e-mail).
A tabela User deve conter os seguintes campos:
- id (int): Chave primária.
- date_creation (datetime): Data de criação do usuário.
- date_last_login (datetime): Data da última autenticação do usuário.
- date_last_access (datetime): Data do último acesso do usuário.
- email (string): Endereço de e-mail do usuário.
- name (string): Nome do usuário (campo obrigatório, mesmo que você não o utilize).
- roles (set): Papéis atribuídos ao usuário.
- services (set): Serviços aos quais o usuário tem acesso.
A tabela AuthToken deve conter os seguintes campos:
- token (string): Hash (algoritmo SHA-256) do token de conexão.
- expiration (datetime): Data e hora de expiração do token.
- user_id (int): Chave estrangeira para o usuário.
Aqui está um exemplo de consulta para criar essas tabelas, na qual você precisa personalizar os campos roles e services da tabela User:
CREATE TABLE User (
id INT UNSIGNED NOT NULL AUTO_INCREMENT,
date_creation DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
date_last_login DATETIME,
date_last_access DATETIME,
email TINYTEXT CHARACTER SET ascii COLLATE ascii_general_ci NOT NULL,
name TINYTEXT,
roles SET('admin', 'writer', 'reviewer'), -- deve ser personalizado
services SET('articles', 'news', 'images'), -- deve ser personalizado
PRIMARY KEY (id),
UNIQUE INDEX email (email(255))
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
CREATE TABLE AuthToken (
token CHAR(64) CHARACTER SET ascii COLLATE ascii_general_ci NOT NULL,
expiration DATETIME NOT NULL,
user_id INT UNSIGNED NOT NULL,
PRIMARY KEY (token),
INDEX expiration (expiration),
FOREIGN KEY (user_id) REFERENCES User (id) ON DELETE CASCADE
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
3Configuração do plugin e do controlador
Você precisa adicionar o objeto \Temma\Controllers\Auth como pré-plugin na configuração do Temma, e criar uma rota para tornar o controlador acessível:
<?php
return [
'plugins' => [
'_pre' => [
'\Temma\Controllers\Auth'
]
],
'routes' => [
'auth' => '\Temma\Controllers\Auth'
]
];
4Configuração das mensagens de conexão
Aqui estão os parâmetros padrão usados para enviar as mensagens de conexão:
- Endereço de e-mail do remetente: contact@ + nome de domínio do seu site
- Título da mensagem: Your connection link
-
Texto da mensagem:
Hi, Here is your connection link: %s It is valid for 1 hour and can only be used once. Best regards
Esses parâmetros podem ser modificados:
<?php
return [
'x-security' => [
'auth' => [
'emailSender' => 'no-reply@mycompany.com',
'emailSubject' => 'Aqui está seu link mágico!',
'emailText' => 'Clique neste link para se conectar: %s',
]
]
];
- Linha 6: Endereço de e-mail do remetente da mensagem.
- Linha 7: Título da mensagem de conexão.
- Linha 8: Conteúdo da mensagem, em texto simples. O marcador %s é substituído pela URL de conexão.
O controlador usa o objeto \Temma\Utils\Email para enviar as mensagens de conexão. Portanto, é possível usar a configuração desse objeto para desativar o envio, autorizar o envio apenas para determinados domínios, ou adicionar destinatários em cópia ou cópia oculta.
5Configuração do registro de usuários
Para registrar automaticamente os usuários que ainda não estão no banco de dados, basta adicionar esta configuração:
<?php
return [
'x-security' => [
'auth' => [
'registration' => true
]
]
];
6Configuração de redirecionamentos
Por padrão, depois que um usuário é autenticado, ele é redirecionado para a página inicial do site. É possível configurar uma URL diferente:
<?php
return [
'x-security' => [
'auth' => [
'redirection' => '/myAccount'
]
]
];
Note que, se existir uma variável de sessão chamada authRequestedUrl, seu conteúdo será usado para realizar o redirecionamento (e a variável é removida da sessão). Essa variável pode ser definida pelo atributo Auth, caso seu parâmetro storeUrl esteja definido como true.
7Configuração do banco de dados
Por padrão, os nomes das tabelas e dos campos são os indicados acima, e essas tabelas devem estar no banco de dados aberto pela conexão chamada db na diretiva de configuração dataSources. Você tem a opção de especificar o nome do banco de dados, os nomes das tabelas e dos campos, caso sejam diferentes do padrão:
<?php
return [
'x-security' => [
'auth' => [
'userData' => [
'base' => 'auth_app',
'table' => 'tUser',
'id' => 'user_id',
'email' => 'user_mail',
'roles' => 'user_roles',
'services' => 'user_services',
],
'tokenData' => [
'base' => 'auth_app',
'table' => 'tToken',
'token' => 'token_string',
'expiration' => 'expiration_date',
'user_id' => 'identifier_user',
]
]
]
];
-
Linhas 6 a 13: Configuração da tabela de usuários.
- Linha 7: Nome do banco de dados que contém a tabela.
- Linha 8: Nome da tabela.
- Linha 9: Nome do campo que contém a chave primária.
- Linha 10: Nome do campo que contém o endereço de e-mail do usuário.
- Linha 11: Nome do campo que contém os papéis do usuário.
- Linha 12: Nome do campo que contém os serviços aos quais o usuário tem acesso.
-
Linhas 14 a 20: Configuração da tabela de tokens de conexão.
- Linha 15: Nome do banco de dados que contém a tabela.
- Linha 16: Nome da tabela.
- Linha 17: Nome do campo que contém o token.
- Linha 18: Nome do campo que contém a data de expiração do token.
- Linha 19: Nome do campo que contém o identificador do usuário.
Neste exemplo, user_id, user_mail, user_roles e user_services são
os nomes reais dos campos da tabela tUser, que contém os usuários.
E token_string, expiration_date e identifier_user são os nomes reais dos
campos da tabela tToken, que contém os tokens de autenticação.
Se a tabela de usuários contiver outros campos que você deseja recuperar, você pode adicioná-los à lista. Se os campos não precisarem ser renomeados, defina a chave e o valor com o mesmo nome:
<?php
return [
'x-security' => [
'auth' => [
'userData' => [
'email' => 'user_mail',
'name' => 'user_name',
'organization' => 'organization',
'birthday' => 'birthday',
]
]
]
];
- Linha 7: Nome do campo que contém o endereço de e-mail do usuário.
- Linha 8: Campo user_name adicionado, renomeado para name.
- Linha 9: Campo organization adicionado, sem renomeação.
- Linha 10: Campo birthday adicionado, sem renomeação.
8Configuração do banco de dados usando DAOs
Em vez de usar o arquivo de configuração (etc/temma.php) para definir os parâmetros do banco de dados, é possível usar DAOs personalizadas.
Exemplo de configuração:
<?php
return [
'x-security' => [
'auth' => [
'userDao' => '\MyApp\UserDao',
'tokenDao' => '\MyApp\TokenDao',
]
]
];
Exemplo de DAO:
namespace MyApp;
class UserDao extends \Temma\Dao\Dao {
protected $_tableName = 'tUser';
protected $_idField = 'user_id';
protected $_fields = [
'user_id' => 'id',
'user_mail' => 'email',
'user_roles' => 'roles',
'user_services' => 'services',
'user_name' => 'name',
'organization',
'birthday',
];
}
9URLs do controlador
O controlador oferece as seguintes URLs:
- /auth/login: Página que exibe o formulário de autenticação.
- /auth/logout: URL para a qual o usuário deve ser enviado para efetuar logout.
A URL /auth redireciona para /auth/login.
10Template
O controlador usa um template Smarty localizado em templates/auth/login.tpl. A versão fornecida pelo Temma é mínima, e recomendamos que você a use como base para criar sua própria versão.
11Variáveis de template
O plugin define as seguintes variáveis de template:
- currentUserId: Identificador do usuário atualmente autenticado.
-
currentUser: Dados do usuário atual. É um array associativo
contendo as seguintes chaves:
- id: Identificador do usuário.
- date_creation: Data de criação do usuário.
- date_last_login: Data da última autenticação do usuário.
- date_last_access: Data do último acesso do usuário.
- email: Endereço de e-mail do usuário.
- name: Nome do usuário.
- roles: Array associativo cujas chaves são os papéis do usuário (associadas ao valor true).
- services: Array associativo cujas chaves são os serviços aos quais o usuário tem acesso (associadas ao valor true).
Essas variáveis podem ser usadas em outros plugins, controladores e templates.
12Atributo Auth
O Temma fornece o atributo Auth, que permite especificar se um controlador ou ação só pode ser acessado por um usuário autenticado (ou não). Como esse atributo se baseia na presença de uma variável de template currentUser (bem como suas chaves roles e services), ele é totalmente compatível com este helper.
Por exemplo, você pode especificar que um controlador só seja acessível a usuários autenticados:
use \Temma\Attributes\Auth as TµAuth;
#[TµAuth]
class Account extends \Temma\Web\Controller {
// ...
}
Também é possível restringir o acesso a controladores ou ações a usuários com um papel específico ou com acesso a um serviço específico:
use \Temma\Attributes\Auth as TµAuth;
class MyController extends \Temma\Web\Controller {
// acesso permitido apenas a usuários com
// o papel "manager"
#[TµAuth('manager')]
public function action1() { }
// permitido apenas a usuários com acesso
// aos serviços "images" ou "text"
#[TµAuth(service: ['images', 'text'])]
public function action2() { }
}
Consulte a documentação do atributo para ver todas as suas capacidades.