Como um provedor JACC pode usar os recursos de mapeamento de principal para função do servidor em que está implantado?

154

Estou escrevendo um JACCprovedor.

Ao longo do caminho, isso significa implementar a PolicyConfiguration.

O PolicyConfigurationresponsável por aceitar informações de configuração do servidor de aplicativos, como quais permissões são atribuídas a quais funções. Isso é para que Policymais tarde possa tomar decisões de autorização quando for entregue informações sobre o usuário atual e o que ele está tentando fazer.

No entanto, não faz parte do PolicyConfigurationcontrato (atroz) manter um mapeamento entre as funções e suas permissões, e Principalsque são atribuídos a essas funções.

Normalmente - sempre, realmente - um servidor de aplicativos hospeda esse mapeamento. Por exemplo, no GlassFish, você afeta esse mapeamento, fornecendo coisas como sun-web.xmle sun-ejb-jar.xmle assim por diante com os seus módulos Java EE. (Esses arquivos específicos do fornecedor são responsáveis ​​por dizer, por exemplo, superusersé um grupo ao qual deve ser atribuída a função de aplicativo admins.)

Gostaria de reutilizar a funcionalidade fornecida por esses arquivos e gostaria de fazê-lo para o maior número possível de servidores de aplicativos.

Aqui está - totalmente arbitrariamente - a opinião da IBM sobre o assunto, que parece confirmar minha suspeita de que o que eu quero fazer é essencialmente impossível . (Mais munição para o meu caso, que este contrato Java EE em particular não vale o papel em que está impresso.)

Minha pergunta: como faço para obter essas informações de mapeamento de principal para função em - para iniciantes - Glassfish e JBoss de dentro de um PolicyConfiguration? Se existe uma maneira padrão de fazer isso que eu não conheço, sou todo ouvidos.

Laird Nelson
fonte
7
Você fez algum progresso nessa questão? Eu gostaria de escrever um provedor JACC também, e também um provedor de autenticação JASPIC a fim de construir aplicações web portáteis ...
perissf
Isso também não parece muito promissor: Because JSR-115 does not define how to address role mapping, WebLogic JACC classes are used for role-to-principal mapping.consulte docs.oracle.com/cd/E24329_01/web.1211/e24485/…
Arjan Tijms
2
Minha opinião sobre isso no momento é que você deve sempre garantir que seu provedor JACC esteja associado a um provedor JASPIC que, portanto, você também é obrigado a escrever. Ainda não segui esse caminho, mas estou na minha mesa para tentar.
Laird Nelson
@LairdNelson, se você tiver tempo, provavelmente deverá escrever uma resposta em torno do seu comentário JASPIC. Isso parece promissor, e há uma recompensa de 300 reputação nessa questão.
jimhark
5
Oi; não tentando manter ninguém em suspense. :-) Eu não tenho uma resposta aqui que eu poderia preparar com pressa. Lembro-me de Ron Monzillo me avisando que a única maneira de obter atribuições de principal a função "em" um provedor JACC de uma maneira que ele possa entender é ter a implementação JASPIC efetivamente acoplada a ele.
Laird Nelson

Respostas:

3

A resposta curta é: não existe uma maneira padrão de fazê-lo.

Embora o Glassfish e o JBoss ofereçam suporte a mapeamentos de principal para função, o JACC não assume que todos os contêineres suportam e, portanto, delega a responsabilidade de manter esses mapeamentos na implementação do provedor JACC. Nos documentos (consulte: PolicyConfiguration.addToRolemethod ):

É tarefa do provedor de políticas garantir que todas as permissões adicionadas a uma função sejam concedidas aos principais "mapeados para a função".

Em outras palavras, você precisa implementar isso dentro do seu provedor JACC para cada contêiner. Para o JBoss, por exemplo, você poderia usar uma das subclasses de AbstractRolesMappingProvider.

Diego
fonte
Como um aparte, um provedor portátil pode optar por ignorar o mapeamento de função de contêiner; poderia, por exemplo, assumir que qualquer entidade principal implica uma função de aplicativo com o mesmo nome, a menos que, de alguma forma, o aplicativo (por meio de um PolicyContextHandlerregistro específico do provedor para esse fim, por exemplo) transmita o contrário. Outro provedor também pode desconsiderar a noção de funções (e, portanto, o fornecido pelo contêiner PolicyConfiguration), operando apenas em mapeamentos de principal para permissão (fornecidos pelo aplicativo) (e onde essas permissões não precisam ser limitadas às do JACC).
Uux 28/01
Nota lateral 2: A partir do Java EE 8, o mapeamento de grupo para função 1: 1 tornou-se o novo padrão (que, no entanto, apenas nos leva a meio caminho, pois as funções ainda devem ser estaticamente declaradas antecipadamente - assumindo que nenhum provedor JACC personalizado seja em vigor).
Uux 28/01