Pergunta

Eu quero acessar o modelo completo dos usuários com seus papéis em meu aplicativo SOAP. Por exemplo, eu poderia querer saber o papel de um usuário chamado "Fred".

Como faço para chegar em algum tipo de registro global JAAS e fazer (pseudocódigo) globalRegistry.getUser ( "Fred"). GetPrincipals () ? (Note que no JAAS, um papel é representado por um principal .)

Eu sei como obter o principal do Assunto do LoginContext , mas que tem dois problemas.

  1. É somente no momento do login, e eu prefiro não código do registo acima mencionado e armazenar o Assunto e principal objetos mim mesmo, como eles já são armazenados pelo appserver.
  2. De preferência, eu quero ser capaz de acessar essas informações, mesmo quando Fred não é o usuário atual.

Eu estou usando Jetty, mas presumo que estes comportamentos são padrão para JAAS.

Foi útil?

Solução

Nós usamos uma variável ThreadLocal para referenciar o usuário atual como foi autenticado no ponto de entrada do sistema (um servlet ou EJB no nosso caso). Isto permite o acesso 'global' para o usuário atual. Isso não está diretamente ligada ao JAAS ou qualquer outro protocolo de segurança, mas pode ser inicializado a partir deles.

EDIT:. O retorno do ThreadLocal é o Assunto para o usuário atual

Acessando outros usuários normalmente seria feito através de algum tipo de módulo de administração.

Outras dicas

Um teste padrão que tenho visto é:

AccessControlContext acc = AccessController.getContext();
Subject subject = Subject.getSubject(acc);
Set<Principal> principals = subject.getPrincipals();

Essencialmente, este encontra o assunto atualmente associado ao segmento atual, e pede para seus diretores.

Um exemplo do uso desta está em Apache Jackrabbit 's RepositoryImpl . É no método extendAuthentication, cuja função é determinar o que Jackrabbit direitos do segmento atual está ao criar uma nova sessão (eu acho).

No entanto, devo salientar que este pode não ser necessariamente verdade o trabalho, pelo menos em contextos J2EE. Estou usando este código sob JBoss AS7, e não encontrar um assunto. Isso pode ser apenas um erro, no entanto.

Para mim, parece que este mizes appsever dos usuários, grupos etc., com papéis de aplicação J2EE.

  • Obter as permissões de um usuário certaion é uma tarefa de administração e, geralmente, tem que ser realizada utilizando APIs específicas do appserver.
  • modelo de programação JAAS funciona em maior nível de abstratcion. Ele só fornece as informações se um usuário está em um papel J2EE (definido dentro do aplicativo)

Eu acredito que JAAS foi projetado para realmente não permitir que o que você está tentando fazer. Eu sei que nos aplicativos que eu construí que eu precisava desse tipo de funcionalidade que eu tinha de side-passo JAAS e programa diretamente para qualquer que seja o repositório de identidade real foi, seja LDAP, ActiveDirectory ou o que quer.

Em um uso EJB

@Resource(mappedName = "java:comp/EJBContext")
protected SessionContext sessionContext;

E tentar com context.lookup("java:comp/EJBContext") em qualquer ponto.


Este código é para família de servidores JBoss, para outros olham em sua JNDI para encontrá-lo.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top