Controle de acesso estaticamente verificado com TypeScript
Esse é um experimento que eu venho fazendo há alguns dias.
A ideia é simples: você tem uma função someAdminAction()
que só pode ser invocada por administradores. Ao tentar invocá-la no endpoint POST /unprivileged
(ou qualquer outro) que espera somente usuários sem privilégio, o TypeScript suscita um diagnóstico. Isso porque entende-se que a função foi invocada num contexto inseguro.
Isso mesmo, uma potencial falha de segurança foi captada no dev/compile time. E isso sem usar nenhuma biblioteca ou plugin mirabolante, apenas tirando proveito do sistema de tipos do TypeScript. O PoC consiste apenas no seguinte (o highlight buga por algum motivo, mas é um código válido):
type RouteContext<TAcceptedRoles extends string> = {
token: {
sub: any
roles: readonly TAcceptedRoles[]
}
}
declare const route: <const TRoles extends string[]>(
method: Uppercase<string>,
path: `/${string}`,
cb: (context: RouteContext<NoInfer<TRoles>[number]>) => any,
options?: {
roles: TRoles
}
) => void
declare const businessLogic1: (context: RouteContext<'visitor'>) => void
declare const businessLogic2: (context: RouteContext<'manager'>) => void
route('GET', '/test', (context) => {
businessLogic1(context) // ok
businessLogic2(context) // Type '"visitor"' is not assignable to type '"manager"'
return {
success: true
}
}, {
roles: [
'visitor'
]
})
Gostaria, com toda a sinceridade, de saber a opinião dos senhores, a respeito da aplicabilidade dessa técnica em cenários reais, se imaginam essa medida extra de segurança sendo efetiva, ou se soa apenas como pirotecnia.
O link agregado contém slides explicativos.
Fonte: https://bit.ly/3TZfGo8