Grupos e Roles dinâmicos no JAAS

2 respostas
countercraft

Pessoal, eu andei lendo alguns tutoriais e exemplos do JAAS, e já consegui entender mais ou menos como ele funciona. Mas em todos os lugares que vi, as roles e os groups são definidos estaticamente em um arquivo, no caso do GlassFish, o sun-web.xml. Eu preciso (e não estou sabendo como fazer) que o JAAS pegue essas roles e groups do banco de dados, sendo que no sistema haverá uma página para cadastro de usuários e grupos, além do cadastro de quais páginas tal grupo pode acessar, ou seja, a permissão de acesso às páginas também teria que ser dinâmica. A estrutura do banco de dados seria a seguinte:

tb_usuario
   id_usuario
   nm_usuario
   ds_login
   ds_senha
tb_perfil
  id_perfil
  ds_perfil
tb_usuario_perfil
  id_usuario_perfil
  id_usuario (referencia tb_usuario)
  id_perfil (referencia tb_perfil)
tb_pagina
  id_pagina
  ds_pagina
  ds_caminho
tb_pagina_perfil
  id_pagina_perfil
  id_pagina (referencia tb_pagina)
  id_perfil (referencia tb_perfil)

Assim, recuperando do banco de dados o sistema teria informações se o grupo ao qual o usuário logado pertence pode acessar a página, então permitindo ou negando o acesso. Mas, pra falar a verdade, não faço a mínima ideia de como implementar isso :frowning:
Estou usando o GlassFish v3 e JSF 2.0 + PrimeFaces.

Agradeço antecipadamente.

2 Respostas

G

Roles não são grupos, e vice-versa. Roles são basicamente as n permissões que você tem em seu sistema, por exemplo, listar-usuarios e manter-usuarios. Você pode, por exemplo, criar um grupo chamado ADMIN e outro NORMAL. Esses grupos podem estar em seu banco de dados. Assim no seu arquivo sun-ejb.jar você diz como é feita a tradução de grupo para roles. Você pode dizer então que o ADMIN possui as roles CUSTOMER_READ (pode ver os cadastros de clientes) e CUSTOMER_WRITE (pode alterar clientes), e o grupo NORMAL possui somente a role CUSTOMER_READ (pode apenasver os cadastros de clientes).

<security-role-mapping>
	<role-name>CUSTOMER_READ</role-name>
	<role-name>CUSTOMER_WRITE</role-name>
	<group-name>ADMIN</group-name>
</security-role-mapping>

<security-role-mapping>
	<role-name>CUSTOMER_READ</role-name>
	<group-name>NORMAL</group-name>
</security-role-mapping>

Obvio que isso é apenas um exemplo. Vocẽ pode adicionar quantas roles vocẽ quiser para um determinado grupo. Na base de dados você pode normalmente alterar o grupo do usuário quando desejar. Quando o usuário efetuar login no contexto do JAAS, o glassfish irá carregar as roles referente àquele grupo que o ususário está.

Note que o grupo pode ser dinâmico, porém a tradução de grupo > roles é fixo mesmo.

Para você então controlar o acesso automatico nos EJBs use isso:

@Stateless
@DeclareRoles( { "CUSTOMER_READ", "CUSTOMER_WRITE" })
public class CustomerBean [...] {
    @AllowedRoles("CUSTOMER_READ")
    public List<Customer> findAllCustomers() [...]

    @AllowedRoles("CUSTOMER_WRITE")
    public void createCustomer(Customer customer) [...]

}
rafaelsantini

<security-role-mapping> <role-name>CUSTOMER_READ</role-name> <role-name>CUSTOMER_WRITE</role-name> <group-name>ADMIN</group-name> </security-role-mapping>
Essa forma parece que não está correta, pois o XML não é válido dessa forma:

The content of element type “security-role-mapping” must match “(role-name,(principal-name|group-name)+)”.

Criado 10 de abril de 2010
Ultima resposta 8 de mar. de 2013
Respostas 2
Participantes 3