Para controlar permissões de acesso ao sistema, crei uma interface
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface Restricao {
String[] value();
}
Para marcar pontos de controle, nos recursos:
@Restricao({"Enviar NF-e", "Enviar CC-e"})
public void processarLote () {
...
}
Para checar se o usuário tem permissão, verifica-se no banco se há cadastro de liberação de acesso:
@Intercepts
@RequestScoped
public class VerificarAutorizacao implements Interceptor {
...
public void intercept(InterceptorStack stack, ResourceMethod method, Object resourceInstance) throws InterceptionException {
...
if(method.getMethod().isAnnotationPresent(Restricao.class)) {
temPermissao = verificaRestricao(userInfo.getUser().getPerfil().getId(), method.getResource().getType().getSimpleName(),
method.getMethod().getAnnotation(Restricao.class).value());
}
...
private boolean verificaRestricao(Long idPerfil, String controller, String[] restricoes){
boolean temPermissao = false;
for (String restr : restricoes) {
temPermissao = permissaoDao().permissaoEm(idPerfil, controller, restr); //perfil do usuário, Controller e restrição anotada no Controller
if (temPermissao)
break;
}
return temPermissao;
Se não existir permissão (conforme a anotação), o usuário recebe a informação que não tem permissão.
Alguém utiliza algo mais simples, mas que pode ter rígido controle de acesso?
