JAAS + Webservice + EJB3

Boa noite pessoal,

Estou meio perdido para implementar o controle de acesso de duas aplicacoes que estou desenvolvendo.
Estou desenvolvendo uma aplicacao de Planejamento de Gastos e outra de Execucao de Gastos com as seguintes caracteristicas.

  • Os backends sao desenvolvidos usando Webservices (JAX-WS) e EJB3
  • Os frontends sao feitos em Delphi, Flex e PHP.
  • As duas aplicacoes interagem uma com a outra
  • Quero implementar um unico servico de autenticacao para os dois sistemas.
    Nao sei como fazer Autenticacao e Autorizacao usando JAAS, de forma que:
  • Cada usuario pertence a uma instituicao, entao, por exemplo quando o usuario chamar o metodo adicionarPagamento(Integer idInstituicao, Pagamento pag){...} eu preciso verificar se este usuario esta associado a instituicao cujo id foi passado como parametro.
  • Nao posso tratar apenas nos frontends pois eles podem ser implementados pelos porprios clientes. Tem que ser tratada no backend.
  • Nao sei como inserir no objeto Principal, retornado pelo metodo contexto.getCallerPrincipal a informacao da instituicao do usuario.

Alguem pode me dar uma luz?

Oi Leandro,

Primeiramente desculpe-me por usar seu tópico para uma dúvida minha, ao invés de responder a sua.

Você pode disponibilziar um exemplo de como vc está consumindo o WebService ? Pode ser em qq uma dessas outras linguagens que vc citou(preferencialmente PHP)

Vc está usando as anotações @Webservice e etc ?

Grato

Cara, eu estou usando essas anotações sim, mas os codigos dos frontends eu nao tenho porque eh outra equipe que desenvolve, mas quando a gente estava escolhendo as tecnologias utilizadas a gente se reuniu e fez uns testes com Delphi 2007.
La tinha uma opcao no menu, que não me lembro de cabeca qual era, que eu passava o endereco do wsdl pra ele e ele gerava todos os stubs necessarios, tipo assim, se meu webservice tivesse a seguinte classe:

public class Calculadora {
  public double soma(double numA, double numB){...}
  public double subtrai(double numA, numB){...}
}

O Delphi gerava uma classe automaticamente mais ou menos assim:

type 
  TCalculadora = class
  function soma(numA, numB: real): real;
  function subtrai(numA, numB: real): real;
end;
implementation

function soma(numA, numB: real): real;
begin
  //Chama o webservice
end;

function subtrai(numA, numB: real): real;
begin
  //Chama o webservice
end;

ja com tudo implementado. So era preciso instanciar o objeto e chamar as functions que ele automaticamente faz a comunicacao com meu webserice. Quanto ao PHP eu nao sei como esta sendo consumido pois eu nao tenho muito contato a galera que desenvolve.

Entendi,

Obrigado leandro.

Não sei se consigo te ajudar mto, mas vamos tentar:

Vc não quer repetir o código dentro dos métodos, é isso?

Caso seja isso, vc pode criar um Interceptor, e declará-lo como sendo da classe, dessa forma ele será executado sempre antes de qualquer método.

O problema dessa abordagem é que obrigaria ao menos um dos parametros de todos seus metodos(e que ele seja sempre o primeiro, ou o segundo, etc) a ser o idInstituição.

Uma outra alternativa seria um método que validasse seu usuário para determinada instituição,e depois disso, devolvesse um token que deveria ser carregado(enviado) em todas as requisições seguintes.

Não sei se é bem o que vc queria, gostaria de poder ajudar mais, mas está além do meu conhecimento.

Abs,

PS