Dúvida - JAAS - Lookup remoto EJB

5 respostas
leandro.costa

Para entendimento da dúvida, descreverei o cenário e as dúvidas logo em seguida.

Cenário:

Estou usando Glassfish V3.

  1. Tenho um projeto WEB, autenticado com JAAS, método FORM, está funcionando normalmente.

  2. Tenho um projeto EJB, que não tem nenhuma configuração em xml e segurança declarativa (anotações) ou programática (callerPrincipal.getName() / inRoles(), etc.).

Primeira dúvida:

  • O web chamará o ejb. Quando os projetos, estao rodando no mesmo domínio (máquina), o lookup ao EJB é efetuado (new InitialContext(null)) e no mesmo eu obtendo o CallerPrincipal.getName() e inRoles() perfeito.
  • Quando eu coloco o EJB em outro máquina (domínio), efetuo o lookup (new InicialContext(properties)) passando host e porta, e o CallerPrincipal.getName() vem em branco!

### Queria saber porque???

Segunda dúvida:

  • Sei que meu EJB, não tem segurança nenhuma, então, preciso colocar a segurança nele. Só que não sei como faço. Sendo que, neste caso, o EJB é chamado pelo contexto web que já está autenticado, com um principal setado e suas roles.

### Como faço está segurança no EJB? Fazendo esta iteração com o JAAS do WEB e EJB.

Terceira dúvida:

  • Quando o EJB está em outra máquina (domínio), e coloco no Bean um simples RolesAllowed({“roleA”, “roleB”}), nada mais, tento do projeto web fazer o lookup, não consigo, recebo CORBA_NO_PERMISSION de exceção.

### Novamente, como efetuo a autenticação e autorização correta entre as camadas web e ejb?

Obrigado.

5 Respostas

bruno.costa

Ninguém ?

Mr_Arthur

Cara, eu estou quase conseguindo fazer a autenticação usando JAAS com o JBoss, mas ainda estou com problemas.
Não sei como funciona no GlassFish mas não deve mudar muito.
Existe um arquivo de configuração onde você configura um módulo de segurança e escolhe o tipo da implementação dele.
Vou mostrar meu problema também... Caso alguém saiba, por favor, help. ;)

No JBoss eu estou configurando uma tag "" dentro do arquivo jboss_home/server/xxx/config/login-config.xml. O tipo da minha autenticação é "org.jboss.security.auth.spi.DatabaseServerLoginModule". Segue configuração:
<application-policy name="seguranca">
	<authentication>
		<login-module code="org.jboss.security.auth.spi.DatabaseServerLoginModule" flag="required">
			<module-option name="dsJndiName">java:/MySqlDS</module-option>
			<module-option name="principalsQuery">SELECT password FROM principals WHERE principal_id=?</module-option>
			<module-option name="rolesQuery">SELECT r.roles, roles_groups FROM roles r WHERE r.principal_id=?</module-option>
		</login-module>
	</authentication>
</application-policy>
Banco de dados: (roles_groups preenchido apenas com 'Roles' em todas as colunas... Não entendi direito, mas parece que é algo do JBoss)
tabela principals com coluna principal_id e password
tabela roles com coluna principal_id, roles, roles_groups
Estou utilizando um DataSource, configurado com meu banco MySQL:
mysql-ds.xml

<datasources>
  <local-tx-datasource>
    <jndi-name>MySqlDS</jndi-name>
    <connection-url>jdbc:mysql://localhost:3306/jboss_login</connection-url>
    <driver-class>com.mysql.jdbc.Driver</driver-class>
    <user-name>root</user-name>
    <password>root</password>
    <exception-sorter-class-name>org.jboss.resource.adapter.jdbc.vendor.MySQLExceptionSorter</exception-sorter-class-name>
    <metadata>
       <type-mapping>mySQL</type-mapping>
    </metadata>
  </local-tx-datasource>
</datasources>
ativei a segurança do meu contexto no arquivo jboss-web.xml dentro do diretório WEB-INF da aplicação:
<jboss-web>
      <security-domain>java:/jaas/seguranca</security-domain>
</jboss-web>
Beleza... A autenticação está funcionando na camada web de boa. Utilizando o código:
response.getWriter().println("Principal da Servlet: " + request.getUserPrincipal().getName());
Eu obtenho o nome do usuário que está logado certinho, Inclusive do lado do EJB com:
@Resource
SessionContext context;
.
.
.
Principal p = context.getCallerPrincipal();
System.out.println("manager: " + context.getCallerPrincipal().getName());

O problema é...
Minhas anotações de restrição de métodos EJB não estão funcionando.
@DenyAll
@RolesAllowed

Verifiquei no arquivo "jboss_home/server/xxx/log/server.log" e reparei a seguinte linha quando eu me logo:
2010-08-26 01:00:34,276 TRACE [org.jboss.security.authorization.modules.ejb.EJBPolicyModuleDelegate] (http-127.0.0.1-8080-1) no match found for security role admin in the deployment descriptor for ejb SecuritySession
Mas espera aí? Que deployment-descriptor? Não basta eu utilizar a anotação @DeclareRoles no nível da classe passando meus roles?
@DeclareRoles({"admin"})

Tentei explicar o problema o máximo possível logo...

R

Mr_Arthur
@DeclaredRoles(…) Serve para declarar papeis utilizados em uma aplicação não para dizer que os papeis estão permitidos para o ejb

Para especificar os papeis permitidos para invocar um metodo bean deve ser utilizado.
@RolesAllowed(value={“admin”,“user”})

Se @RolesAllowed for utilizado no nivel da classe sera aplicado a todos metodos, se utilizado no metodo ao metodo.

Não é uma boa pratica utilizar getName() pensando que este seria o nome do usuario pois servidores distintos podem se comportar de maneira distintas no resultado.
Deve-se utilizar o metodo .isCallerInRole(“regraUsuario”);

@Resource SessionContext context; . . . Principal p = context.getCallerPrincipal(); System.out.println("manager: " + context.getCallerPrincipal().getName());

Mr_Arthur

Justamente… Falar para o EJB quais roles eu irei utilizar na minha segurança. Mas… Eu preciso declarar todos os roles da minha aplicação aqui ou declaro apenas os que eu vou fazer algum tratamento?

Para especificar os papeis permitidos para invocar um metodo bean deve ser utilizado.
@RolesAllowed(value={“admin”,“user”})

Fiz isso, mas fiz assim: @RolesAllowed({“admin”,“user”})

Valeu pela dica do getName, vou reparar nisso quando estiver utilizando EJB pra valer.
Mas por enquanto eu estava apenas fazendo testes pra ver se o módulo de login estava funcionando do lado web e do lado EJB.

Não testarei isso hoje pois o notebook está em casa, mas acho que ainda não achei uma solução pra o erro.

bruno.costa

RESOLVIDO… faltou @DeclareRoles :shock:

agora estou recebendo outro erro

Caused by: org.omg.CORBA.MARSHAL: vmcid: SUN minor code: 257 completed: Maybe

Criado 17 de agosto de 2010
Ultima resposta 7 de set. de 2010
Respostas 5
Participantes 4