Para entendimento da dúvida, descreverei o cenário e as dúvidas logo em seguida.
Cenário:
Estou usando Glassfish V3.
Tenho um projeto WEB, autenticado com JAAS, método FORM, está funcionando normalmente.
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?
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:
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
rafaelps.java
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