O mais incrível é que ainda não compreendi com clareza o problema que você descreveu.
O que eu entendi é que você precisa proteger o acesso a URLs e blocos de página dependendo do papel (ou ator do caso de uso), correto?
Quando o usuário loga no sistema você consulta uma tabela para resgatar todos os papeis que esse usuário tem, correto?
No seu lugar eu usaria o Realm ou o Jaas para fazer a autenticação pois eles já estão prontos e funcionam muito bem. Se você tiver tempo pra gastar querendo implementar o mecanismo na mão vai em frente, mas usar um Realm da vida é mais fácil e tem muitas vantagens.
Quando você loga pelo Realm você pode usar o
facesContext.getExternalContext().isUserInRole("ADMIN") para saber se o usuário está no login correto.
Se você estiver usando facelets (que eu também recomendo) você pode até criar uma função ou um componente para fazer isso automático ou usar algum pronto. Dessa forma você pode proteger a URL pelo web.xml da forma padrão com o uso de security-constraints e usar função/componente para proteger os blocos tipo:
<app:renderIfUserInRole roles="ADMIN, STAFF">
<h:form>
<h:commandButton ...>
<!-- o resto do bloco aqui -->
</app:renderIfUserInRole>
ou:
<h:commandButton rendered="#{app:isUserInRole('ADMIN, STAFF')}" ...
ou:
<c:if test="#{app:isUserInRole('ADMIN, STAFF')}">
<!-- seu bloco aqui -->
</c:if>
Em fim, tem opções diferentes.