JSF: Como apresentar diferentemente o menu da aplicação dependendo do papel do usuário?

Boa noite,

tenho uma aplicação JSF/Facelets/EJB na qual estou utilizando o JAAS. O acesso (ou a negação deste) às páginas e aos EJB por diferentes papéis está funcionando a contento. O único problema é como montar o menu da aplicação (residindo em um template Facelets) mostrando apenas as opções às quais o usuário tem acesso.

As duas soluções que encontrei e que funcionaram foi:
1- colocar os papéis em elementos <f:attribute> dos <h:commandLink>, do tipo

<h:commandLink ....> <f:attribute name="roles" value="admin,usuario"/> </h:commandLink> e espalhar binding e rendered em todos os links para que o managed bean responda quem será renderizado e quem não.

2- Criar três versões (pois temos, neste sistema, três papéis) do menu no template e renderizá-los seletivamente.

Não considero nenhuma das duas opções é particularmente boa. Exigem código demais, ferem o princípio do DRY (Don’t Repeat Yourself), são extremamente hardcoded.

Tentei criar um componente mas não consegui fazer passar o atributo action.

Alguém teria uma solução mais inteligente pra isto (ou sabe criar um componente que estenda UICommand)?

Obrigado.

Gere/Crie o menu dinamicamente no managed bean e faça o binding com a página deste componente de menu. Assim só será gerado o menu de acordo com as permissões do usuário, Além de ser mais simples ainda vai ter poupar recursos no servidor.

Meu menu é uma lista

    onde cada
  • contém um <h:commandLink> (e, eventualmente, outro
      para submenus). O que é esse componente de menu? A sua resposta dá a entender que é um componente único. Se for, eu não conheço.

Quando você falou de menu imaginei que você estivesse falando de algo como,
http://livedemo.exadel.com/richfaces-demo/richfaces/dropDownMenu.jsf?c=dropDownMenu

Vou dar uma olhada no Rich Faces. Aqui somos muito HTML/CSS oriented e acabamos esquecendo de soluções server-side. E excelente sugestão de montar o menu no servidor, não fazendo a view saber de papéis e tal, fica bem melhor mesmo e aumenta a coesão. Obrigado!

Um exemplo bem simples usando JSCookMenu
http://wiki.apache.org/myfaces/Dynamic_Menus_with_JSCookMenu