Javascript e permissões de acesso
Olá a todos.
Depois de algum tempo sem postar (ocupado em alguns projetos), estou de volta. Desta vez trago uma espécie de idéia que estou tentando aperfeiçoar e qualquer incremento à ela será muito bem vindo.
Estou entrando em um projeto onde utilizamos ExtJS, uma biblioteca Javascript que permite a criação de interfaces ricas, principalmente para desenvolver sistemas web. Um exemplo básico você pode encontrar no site do ExtJS ou neste pequeno aplicativo base que desenvolvi (usuário: admin, senha: 1234).
Se você reparar neste aplicativo base, existe uma área onde configuram-se permissões aos grupos de usuários (atrelados aos usuários), de tal modo que a idéia é que se um usuário não tenha acesso à determinada área (por exemplo, adicionar um novo usuário), a opção não seja exibida (e preferenciamente nada referente seja carregado para evitar Javascript Injection).
No lado do servidor, que processa as requisições Ajax, nenhum problema. Se o usuário logado não tem permissão para listar os grupos, o acesso à essa lista é bloqueado, com uma classe simples que desenvolvi:
<?php
class DMG_Acl {
// algumas implementações anteriores
public function canAccess ($rule) {
/* aqui são executadas algumas verificações no banco de dados para determinar se o usuário logado atualmente tem acesso à área que eu designo, referenciada em $rule dentro deste método. A saída é basicamente true para acesso permitido e false para acesso negado. */
}
// algumas implementações posteriores
}
Certo. A questão é como fazer com que o Javascript utilizado para montar as interfaces no ExtJS seja mínimo e seguro, carregando apenas o necessário, sem furos para possíveis injeções de Javascript.
A solução xula que encontrei foi, juntar o Javascript ao PHP, e fazer verificações internas. Por exemplo, se o usuário não tem acesso à regra 10, que permite o acesso à inserção de novos usuários, o método que utilizei fica próximo à:
<?php if (DMG_Acl::canAccess(10)): ?>
{
text: 'Adicionar usuário',
iconCls: 'silk-add',
scope: this,
handler: this._onBtnNovoUsuarioClick
},
<?php endif; ?>
Ok. Eu processo os arquivos como PHP normalmente, e recebo em Javascript somente o código do qual as permissões do usuário deixam, logo, o código acima só seria retornado caso o usuário possuir permissão de acesso na regra 10.
O grande problema: essa implementação é falha durante a mudança de permissões. Se um usuário retirar as permissões de outro usuário enquanto este está utilizando o sistema, a os botões ou links não irão sumir. No lado do servidor a regra surtirá efeito, porém não na interface.
Outro grande problema é a mistura do PHP com o Javascript e uma pequena gambiarra para fazer esse sistema de permissões funcionar, que não me agrada nem um pouco.
Queria deixar aqui uma dica para quem precisa de uma implementação deste tipo, mas também um alerta, que, acredito eu, não seja a maneira mais eficaz de se fazer isso, e ainda, um pedido de ajuda à quem tiver idéias para resolver este problema de forma mais correta.
Até mais,
Rafael.
