Home > Criar um plugin
[!IMPORTANT]
Em desenvolvimento (2.0). Ainda não está numa versão lançada e pode mudar.Nível: avançado
Em uma frase: um plugin é uma classe que herda TRALPlugin e diz em que momento
do pedido quer agir; o servidor chama só aquele momento.
Você vai precisar: entender Plugins. Para um grupo de rotas, o
caminho é outro: Criar um módulo.
Phases)| Fase | Método que você sobrescreve | Quando roda | Para quê |
|---|---|---|---|
ppValidate |
ValidateRequest |
antes de o corpo ser lido | recusar cedo: responder 400 ou mais encerra o pedido |
ppProcess |
ProcessRequest(..., var AHandled) |
antes das rotas | mexer no pedido/resposta; AHandled := True responde ali mesmo |
ppResolveRoute |
ResolveRoute |
ao procurar a rota | oferecer uma rota própria (como a /gettoken do JWT) |
ppAuthenticate |
Authenticate |
ao autenticar | ser um tipo de login |
ppAuthResult |
AfterAuthenticate, AuthAttempt |
depois do veredito do login | reagir ao resultado (é onde a força bruta conta) |
Além disso: ServerActivating e ServerDeactivating, quando o servidor liga e
desliga.
A ordem entre plugins é a Priority, maior primeiro. Os do RAL vão de 950
(cabeçalhos de segurança) a 50 (fila); um plugin novo nasce com 100. As constantes
estão em RALPlugin (RALPriorityCORS, RALPriorityAuthentication...).
unit PluginChaveAPI;
interface
uses
Classes, SysUtils,
RALPlugin, RALRequest, RALResponse, RALTypes, RALConsts;
type
TPluginChaveAPI = class(TRALPlugin)
private
FChave: StringRAL;
protected
function Phases: TRALPluginPhases; override;
public
procedure ValidateRequest(ARequest: TRALRequest; AResponse: TRALResponse); override;
published
property Chave: StringRAL read FChave write FChave;
end;
implementation
function TPluginChaveAPI.Phases: TRALPluginPhases;
begin
Result := [ppValidate]; // só este momento é chamado
end;
procedure TPluginChaveAPI.ValidateRequest(ARequest: TRALRequest; AResponse: TRALResponse);
begin
if ARequest.GetHeader('X-Api-Key') <> FChave then
AResponse.Answer(HTTP_Unauthorized, '{"erro":"chave inválida"}');
// status >= 400: o pedido para aqui, a rota não roda
end;
end.
Usar:
vChave := TPluginChaveAPI.Create(Self);
vChave.Chave := 'abc123';
vChave.Server := Servidor;
procedure Register;
begin
RegisterComponents('RAL - Plugins', [TPluginChaveAPI]);
end;
Phases são chamadas. Uma fase que nenhum plugin usa não custaChanged quando ela mudar.ServerDeactivating roda com pedidos ainda em andamento: não libere o que umaServerActivating impede o servidor de ligar.Enabled := False tira o plugin do caminho sem desligá-lo do servidor.