Gerar links no menu baseado nas permissões de usuário
04/07/2012 16:15
0
Amigos,

gostaria de gerar um menu na página inicial da minha app baseado nas permissões de acesso do Spring Security. O menu seria composto pelo nome dos meus controllers com o respectivo link para acessá-los, mas só seriam exibidos aqueles que o usuário tem permissão de acesso.

Por exemplo o controlador abaixo:

import grails.plugins.springsecurity.Secured

@Secured(['ROLE_ADMIN'])
class CadastroClienteController {
def scaffold = true
}

Ele só dá permissão de acesso à quem é administrador. Portanto, seria interessante que que o menu da minha aplicação nem mesmo exibisse o link para esse controlador.

Sei que isso pode ser resolvido na view, com o seguinte código:

<ul class="dropdown-menu">
<li class="menu">Menu</li>
<sec:ifAllGranted roles="ROLE_ADMIN">
<g:each var="c" in="${grailsApplication.controllerClasses.sort { it.fullName }}">
<li<%= c.logicalPropertyName == controllerName ? ' class="active"' : '' %>><g:link controller="${c.logicalPropertyName}">${c.logicalPropertyName.toUpperCase()}</g:link></li>
</g:each> </sec:ifAllGranted>
</ul>

Mas o problema dessa abordagem é que sempre que eu tiver um novo controlador eu vou precisar escrever esses códigos na minha view. Como tenho vários controladores, com o tempo isso vai sair do controle. Eu queria mesmo era que esse html fosse construído dinamicamente. Pensei em usar uma Tag Lib, mas sou novo com o grails e alguns conceitos eu ainda estou aprendendo e não consegui fazer sozinho.

Alguém poderia me ajudar?? Creio que seja um assunto muito útil e do desejo de muitos que trabalham com sistemas desse tipo!

Muito obrigado.
Tags: spring security, menu dinâmico, taglib, segurança


1
como voce esta fazendo com scaffold acaba perdendo algum controle da aplicação eu uso essa mesma tag que voce falou mas meu css é personalisa e toda vez que quero mostrar eu faco na mão mesmo

mas acho que se voce recuperar a permissão dele e passar por parametro e fazer um if na tela pode ser que resolva!!!
04/07/2012 17:13


1
Eu não uso o spring-security, até porque acho que essa abordagem ai funciona bem para sites com área pública e administrativa, já para sistema não rola, porque temos permissões personalizadas.

Eu criei uma assim:

Tabela de Permissoes (menuCadastro, menufinanceiro, bancos, clientes e etc)
Tabela de grupos (administrativo, comercial, financeiro, diretoria, atendimento e etc)
Tabela de GrupoPermissao( idPermissao, idGrupo, podeVer, podeCadastrar, podeAlterar, podeExcluir e etc)

Tabela de Usuários (dados gerais de usuários e idGrupo)

Então quando loga, dentro da view eu já testo o cara mais ou menos assim:


<g:if test="session.usuario.grupo.get('menuCadastro').podeVer">
Aqui você acrescenta o link do menu.
</g:if>


espero ter ajudado.
04/07/2012 17:27


1
Apenas para reforçar um detalhe que esqueci.

O código "session.usuario.grupo.get('nome da permissao')" está assim porque o relacionamento de grupo para permissao é do tipo HashMap, ai você consegue dar o get no nome.

valeu
04/07/2012 17:28


0
Valeu pelas idéias, pessoal!

O Spring Security é bem personalizável e consegui implementar bem todos os requisitos de segurança com a sintaxe fornecida pelo app, fazendo apenas algumas customizações.

Vc consegue facilmente recuperar um usuário logado e suas devidas permissões do sistema, sem muitos problemas. E o plugin ainda fornece alguns helpers que auxiliam na hora de exibir alguma informação no seu GSP.

O que eu queria na verdade era uma forma de "construir" um menu (lista html) que apenas exibisse o link para o controlador se o usuário tivesse a permissão para acessa-lo. Do contrário, o link não apareceria. Poderia fazer isso manualmente, mas sempre que incluísse algum controlador novo, teria que incluir um novo código no meu html, o que não é algo muito intuitivo...

Enfim, caso alguém tenha bom conhecimento do Spring Security e queira me ajudar eu ficaria muito agradecido!

Forte abraço à todos.
04/07/2012 17:50


1
Ronaldo, você pode criar um tamplate de menu. Vá nos layouts dentro do pacote Views and Layouts. Crie um arquivo _menu.gsp, e nele faça algo do gênero(monte o menu a seu critério):

<sec:ifNotLoggedIn>
<!-- MENU SE NÃO LOGADO -->
<nav>
<ul>
<li><g:link controller="home"action="index">Home</g:link></li>
<li><g:link controller="home"action="estudios">Estúdios</g:link></li>
<li><g:link controller="home"action="faleConosco">Fale Conosco</g:link></li>
</ul>
</nav>
</sec:ifNotLoggedIn>


<sec:ifAnyGranted roles="ROLE_ADMIN">
<!-- MENU SE LOGADO COMO ADMIN -->
<nav>
<ul>
<li> <a class="home" href="${createLink(uri: '/')}">Home</a></li>
<li> <g:link controller="usuario" action="list">Usuários</g:link> </li>
<li> <g:link controller="feriado" action="list">Feriados</g:link> </li>
</ul>
</nav>
</sec:ifAnyGranted>

Agora, vá no tamplate main.gsp, e faça a inclusão desse menu onde vc quiser que ele fique, seja no body, no header, dentro de um section, div, etc.. Ex:

<body>
<g:render template="/layouts/menu"/>

....

Agora você deve setar suas páginas para utilizar este layout, (<meta name='layout' content='main'/>), com isso todo o site seguirá o esqueleto desse layout que você customizar, além disso todo o menu poderá ser centralizado em um único arquivo, facilitando a manutenção futuramente.

Espero ter ajudado.
[]'s

Luciano
04/07/2012 19:11


0
@Luciano,

Esta é a forma manual que eu já vinda fazendo. Tentei de tudo aqui mas pelo visto é melhor fazer dessa maneira mesmo. Dinamicamente dá muito trabalho.

Obrigado à todos!
10/07/2012 13:43



Ainda não faz parte da comunidade???

Para se registrar, clique aqui.


Aprenda Groovy e Grails com a Formação itexto!

Newsletter Semana Groovy

Assinar

Envie seu link!


Livro de Grails


/dev/All

Os melhores blogs de TI (e em português) em um único lugar!

 
Creative Commons
RSS Grails Brasil é mantido por itexto Consultoria.
Em caso de problemas contacte Henrique Lobo Weissmann (Kico) por e-mail: kico@itexto.com.br
Todo o conteúdo presente neste site adota o Creative Commons como licença padrão.
Ver: 4.14.0
itexto