Proteja aplicativos Java WebSphere usando funções de aplicativo e declarações de função
Este artigo demonstra um aplicativo Java WebSphere que usa o OpenID Connect para entrar usuários e o Microsoft Entra ID Application Roles (funções de aplicativo) para autorização.
Este aplicativo implementa o controle de acesso baseado em função (RBAC) usando as funções de aplicativo e o recurso de declarações de função do Microsoft Entra ID. Outra abordagem é usar grupos de ID do Microsoft Entra e declarações de grupo. Os grupos de ID do Microsoft Entra e as funções de aplicativo não são mutuamente exclusivos. Você pode usá-los ambos para fornecer controle de acesso refinado.
Você também pode usar o RBAC com funções de aplicativo e declarações de função para aplicar políticas de autorização com segurança.
Para assistir a um vídeo que aborda este cenário e este exemplo, consulte Implementar autorização em seus aplicativos usando funções de aplicativo, grupos de segurança, escopos e funções de diretório.
Para obter mais informações sobre como os protocolos funcionam neste cenário e em outros cenários, consulte Autenticação versus autorização.
Esta aplicação utiliza o MSAL para Java (MSAL4J) para iniciar sessão num utilizador e obter um token de ID do Microsoft Entra ID.
Este exemplo usa primeiro o MSAL para Java (MSAL4J) para entrar no usuário. Na página inicial, ele exibe uma opção para o usuário visualizar as declarações em seus tokens de ID. Este aplicativo também permite que os usuários visualizem uma página de administração privilegiada ou uma página de usuário regular, dependendo da função do aplicativo à qual foram atribuídos. A ideia é fornecer um exemplo de como, dentro de um aplicativo, o acesso a determinadas funcionalidades ou páginas é restrito a subconjuntos de usuários, dependendo da função a que pertencem.
Este tipo de autorização é implementado usando RBAC. Com o RBAC, um administrador concede permissões a funções, não a usuários individuais ou grupos. O administrador pode, então, atribuir funções a diferentes usuários e grupos para controlar quem tem acesso a determinado conteúdo e funcionalidade.
Este aplicativo de exemplo define as duas funções de aplicativo a seguir:
PrivilegedAdmin
: Autorizado a aceder às páginas Apenas Administradores e Utilizadores Regulares.RegularUser
: Autorizado a aceder à página de Utilizadores Regulares.
Essas funções de aplicativo são definidas no portal do Azure no manifesto de registro do aplicativo. Quando um usuário entra no aplicativo, o Microsoft Entra ID emite uma declaração de funções para cada função concedida individualmente ao usuário na forma de associação de função.
Você pode atribuir usuários e grupos a funções por meio do portal do Azure.
Nota
As declarações de função não estarão presentes para usuários convidados em um locatário se o https://login.microsoftonline.com/common/
ponto de extremidade for usado como autoridade para entrar em usuários. Você precisa entrar em um usuário em um ponto de extremidade locatário como https://login.microsoftonline.com/tenantid
.
Pré-requisitos
- JDK versão 8 ou superior
- Maven 3
- Um locatário do Microsoft Entra ID. Para obter mais informações, consulte Como obter um locatário do Microsoft Entra ID.
- Uma conta de usuário em seu próprio locatário do Microsoft Entra ID se você quiser trabalhar apenas com contas em seu diretório organizacional - ou seja, modo de locatário único. Se ainda não criou uma conta de utilizador no seu inquilino, deve fazê-lo antes de prosseguir. Para obter mais informações, consulte Como criar, convidar e excluir usuários.
Recomendações
- Alguma familiaridade com os servlets Java / Jacarta.
- Alguma familiaridade com o terminal Linux/OSX.
- jwt.ms para inspecionar seus tokens.
- Fiddler para monitorizar a sua atividade de rede e resolução de problemas.
- Siga o Blog do Microsoft Entra ID para ficar atualizado com os últimos desenvolvimentos.
Configurar o exemplo
As seções a seguir mostram como configurar o aplicativo de exemplo.
Clone ou faça download do repositório de exemplo
Para clonar o exemplo, abra uma janela Bash e use o seguinte comando:
git clone https://github.com/Azure-Samples/ms-identity-msal-java-samples.git
cd 3-java-servlet-web-app/3-Authorization-II/roles
Como alternativa, navegue até o repositório ms-identity-msal-java-samples , faça o download como um arquivo .zip e extraia-o para o disco rígido.
Importante
Para evitar limitações de comprimento de caminho de arquivo no Windows, clone ou extraia o repositório em um diretório perto da raiz do seu disco rígido.
Registrar o aplicativo de exemplo com seu locatário do Microsoft Entra ID
Há um projeto neste exemplo. As seções a seguir mostram como registrar o aplicativo usando o portal do Azure.
Escolha o locatário do Microsoft Entra ID onde você deseja criar seus aplicativos
Para escolher seu locatário, use as seguintes etapas:
Inicie sessão no portal do Azure.
Se sua conta estiver presente em mais de um locatário do Microsoft Entra ID, selecione seu perfil no canto do portal do Azure e selecione Alternar diretório para alterar sua sessão para o locatário desejado do Microsoft Entra ID.
Registrar o aplicativo (java-servlet-webapp-roles)
Primeiro, registre um novo aplicativo no portal do Azure seguindo as instruções em Guia de início rápido: registrar um aplicativo com a plataforma de identidade da Microsoft.
Em seguida, use as seguintes etapas para concluir o registro:
Navegue até a página Registros de aplicativos da plataforma de identidade da Microsoft para desenvolvedores.
Selecione Novo registo.
Na página Registrar um aplicativo exibida, insira as seguintes informações de registro do aplicativo:
Na seção Nome, insira um nome de aplicativo significativo para exibição aos usuários do aplicativo - por exemplo,
java-servlet-webapp-roles
.Em Tipos de conta suportados, selecione uma das seguintes opções:
- Selecione Contas neste diretório organizacional somente se estiver criando um aplicativo para uso somente por usuários em seu locatário - ou seja, um aplicativo de locatário único.
Na seção URI de redirecionamento, selecione Web na caixa de combinação e digite o seguinte URI de redirecionamento:
http://localhost:8080/msal4j-servlet-roles/auth/redirect
.
Selecione Registar para criar a aplicação.
Na página de registro do aplicativo, localize e copie o valor da ID do aplicativo (cliente) para usar mais tarde. Você usa esse valor no(s) arquivo(s) de configuração do seu aplicativo.
Selecione Guardar para guardar as alterações.
Na página de registo da aplicação, selecione Certificados & segredos no painel de navegação para abrir a página onde pode gerar segredos e carregar certificados.
Na seção Segredos do cliente, selecione Novo segredo do cliente.
Digite uma descrição - por exemplo, segredo do aplicativo.
Selecione uma das durações disponíveis: Em 1 ano, Em 2 anos ou Nunca expira.
Selecione Adicionar. O valor gerado é exibido.
Copie e salve o valor gerado para uso em etapas posteriores. Você precisa desse valor para os arquivos de configuração do seu código. Esse valor não é exibido novamente e você não pode recuperá-lo por nenhum outro meio. Portanto, certifique-se de salvá-lo do portal do Azure antes de navegar para qualquer outra tela ou painel.
Definir as funções do aplicativo
Para definir as funções do aplicativo, use as seguintes etapas:
Ainda no mesmo registro de aplicativo, selecione Funções do aplicativo no painel de navegação.
Selecione Criar função de aplicativo e insira os seguintes valores:
- Em Nome para exibição, insira um nome adequado - por exemplo, PrivilegedAdmin.
- Em Tipos de membros permitidos, escolha Usuário.
- Em Valor, insira PrivilegedAdmin.
- Em Descrição, insira PrivilegedAdmins que podem visualizar a Página de administrador.
Selecione Criar função de aplicativo e insira os seguintes valores:
- Em Nome para exibição, insira um nome adequado - por exemplo, RegularUser.
- Em Tipos de membros permitidos, escolha Usuário.
- Em Valor, insira RegularUser.
- Em Descrição, insira Usuários Regulares que podem visualizar a Página do Usuário.
Selecione Aplicar para guardar as alterações.
Atribuir usuários às funções do aplicativo
Para adicionar usuários à função de aplicativo definida anteriormente, siga as diretrizes aqui: Atribuir usuários e grupos a funções.
Configure o aplicativo (java-servlet-webapp-roles) para usar o registro do aplicativo
Use as seguintes etapas para configurar o aplicativo:
Nota
Nas etapas a seguir, ClientID
é o mesmo que Application ID
ou AppId
.
Abra o projeto no seu IDE.
Abra o arquivo authentication.properties .
Localize a cadeia de caracteres
{enter-your-tenant-id-here}
. Substitua o valor existente pelo ID de locatário do Microsoft Entra ID.Localize a cadeia de caracteres
{enter-your-client-id-here}
e substitua o valor existente pela ID do aplicativo ouclientId
dojava-servlet-webapp-call-graph
aplicativo copiado do portal do Azure.Localize a cadeia de caracteres
{enter-your-client-secret-here}
e substitua o valor existente pelo valor que você salvou durante ajava-servlet-webapp-roles
criação do aplicativo, no portal do Azure.Localize a
app.roles
propriedade e certifique-se de que o valor está definido comoapp.roles=admin PrivilegedAdmin, user RegularUser
, ou substitua os nomes das suas funções específicas.
Criar o exemplo
Para criar o exemplo usando o Maven, navegue até o diretório que contém o arquivo pom.xml para o exemplo e execute o seguinte comando:
mvn clean package
Este comando gera um arquivo .war que você pode executar em vários servidores de aplicativos.
Executar o exemplo
Estas instruções pressupõem que você instalou o WebSphere e configurou um servidor. É possível usar a orientação em Implementar o WebSphere Application Server (tradicional) Cluster em Máquinas Virtuais do Azure para uma configuração básica do servidor.
Antes de implantar no WebSphere, use as seguintes etapas para fazer algumas alterações de configuração no próprio exemplo e, em seguida, compilar ou reconstruir o pacote:
Navegue até o arquivo authentication.properties do seu aplicativo e altere o valor de para a URL do servidor e o número da
app.homePage
porta que você está planejando usar, conforme mostrado no exemplo a seguir:# app.homePage is by default set to dev server address and app context path on the server # for apps deployed to azure, use https://your-sub-domain.azurewebsites.net app.homePage=https://<server-url>:<port-number>/msal4j-servlet-auth/
Depois de salvar esse arquivo, use o seguinte comando para reconstruir seu aplicativo:
mvn clean package
Depois que o código terminar de construir, copie o arquivo .war para o sistema de arquivos do servidor de destino.
Você também precisa fazer a mesma alteração no registro do aplicativo do Azure, onde você o define no portal do Azure como o valor de URI de redirecionamento na guia Autenticação.
Navegue até a página Registros de aplicativos da plataforma de identidade da Microsoft para desenvolvedores.
Use a caixa de pesquisa para pesquisar o registro do seu aplicativo - por exemplo,
java-servlet-webapp-authentication
.Abra o registro do aplicativo selecionando seu nome.
Selecione Autenticação a partir do menu.
Na seção URIs de redirecionamento da Web - , selecione Adicionar URI.
Preencha o URI do seu aplicativo, anexando /auth/redirect - por exemplo,
https://<server-url>:<port-number>/auth/redirect
.Selecione Guardar.
Use as seguintes etapas para implantar o exemplo usando o Console de Soluções Integradas do WebSphere:
Na guia Aplicativos, selecione Novo Aplicativo e, em seguida, Novo Aplicativo Empresarial.
Escolha o arquivo .war que você criou e, em seguida, selecione Avançar até chegar à etapa Mapear raízes de contexto para instalação de módulos da Web. As outras configurações padrão devem ser boas.
Para a raiz de contexto, defina-a com o mesmo valor que após o número da porta no 'URI de redirecionamento' definido na configuração de exemplo/registro do aplicativo do Azure. Ou seja, se o URI de redirecionamento for
http://<server-url>:9080/msal4j-servlet-auth/
, então a raiz de contexto deve sermsal4j-servlet-auth
.Selecione Concluir.
Depois que o aplicativo concluir a instalação, vá para a seção WebSphere enterprise applications da guia Aplicativos .
Selecione o arquivo .war que você instalou na lista de aplicativos e, em seguida, selecione Iniciar para implantar.
Depois que a implantação terminar, navegue até
http://<server-url>:9080/{whatever you set as the context root}
e você poderá ver o aplicativo.
Explorar o exemplo
Use as seguintes etapas para explorar o exemplo:
- Observe o status de entrada ou saída exibido no centro da tela.
- Selecione o botão sensível ao contexto no canto. Este botão lê Iniciar sessão quando executa a aplicação pela primeira vez.
- Na página seguinte, siga as instruções e entre com uma conta no locatário do Microsoft Entra ID.
- Na tela de consentimento, observe os escopos que estão sendo solicitados.
- Observe que o botão sensível ao contexto agora diz Sair e exibe seu nome de usuário.
- Selecione Detalhes do token de ID para ver algumas das declarações decodificadas do token de ID.
- Selecione Somente administradores para visualizar a
/admin_only
página. Somente os usuários com funçãoPrivilegedAdmin
de aplicativo podem visualizar esta página. Caso contrário, uma mensagem de falha de autorização será exibida. - Selecione Usuários regulares para visualizar a
/regular_user
página. Somente usuários com funçãoRegularUser
de aplicativo ouPrivilegedAdmin
podem exibir esta página. Caso contrário, uma mensagem de falha de autorização será exibida. - Use o botão no canto para sair.
Sobre o código
Este exemplo usa o MSAL para Java (MSAL4J) para entrar um usuário e obter um token de ID que pode conter a declaração de funções. Com base na declaração de funções presente, o usuário conectado pode acessar nenhuma, uma ou ambas as páginas Admins Only
protegidas e Regular Users
.
Se quiser replicar o comportamento deste exemplo, você pode copiar o arquivo pom.xml e o conteúdo das pastas helpers e authservlets na pasta src/main/java/com/microsoft/azuresamples/msal4j . Você também precisa do arquivo authentication.properties . Essas classes e arquivos contêm código genérico que você pode usar em uma ampla variedade de aplicativos. Você também pode copiar o restante do exemplo, mas as outras classes e arquivos são criados especificamente para abordar o objetivo deste exemplo.
Conteúdos
A tabela a seguir mostra o conteúdo da pasta de projeto de exemplo:
Ficheiro/pasta | Description |
---|---|
src/main/java/com/microsoft/azuresamples/msal4j/roles/ | Este diretório contém as classes que definem a lógica de negócios de back-end do aplicativo. |
src/main/java/com/microsoft/azuresamples/msal4j/authservlets/ | Este diretório contém as classes que são usadas para entrar e sair pontos de extremidade. |
____Servlet.java | Todos os pontos de extremidade disponíveis são definidos em .java classes que terminam em ____Servlet.java. |
src/main/java/com/microsoft/azuresamples/msal4j/helpers/ | Classes auxiliares para autenticação. |
AuthenticationFilter.java | Redireciona solicitações não autenticadas para pontos de extremidade protegidos para uma página 401. |
src/main/resources/authentication.properties | Microsoft Entra ID e configuração do programa. |
src/principal/webapp/ | Este diretório contém os modelos UI - JSP |
CHANGELOG.md | Lista de alterações à amostra. |
CONTRIBUTING.md | Orientações para contribuir para a amostra. |
LICENÇA | A licença para a amostra. |
Processar uma declaração de funções no token de ID
A declaração de funções do token inclui os nomes das funções às quais o usuário conectado está atribuído, conforme mostrado no exemplo a seguir:
{
...
"roles": [
"Role1",
"Role2",]
...
}
ConfidentialClientApplication
Uma ConfidentialClientApplication
instância é criada no arquivo AuthHelper.java , conforme mostrado no exemplo a seguir. Esse objeto ajuda a criar a URL de autorização do Microsoft Entra e também ajuda a trocar o token de autenticação por um token de acesso.
// getConfidentialClientInstance method
IClientSecret secret = ClientCredentialFactory.createFromSecret(SECRET);
confClientInstance = ConfidentialClientApplication
.builder(CLIENT_ID, secret)
.authority(AUTHORITY)
.build();
Os seguintes parâmetros são usados para instanciação:
- A ID do cliente do aplicativo.
- O segredo do cliente, que é um requisito para Aplicativos Clientes Confidenciais.
- A Autoridade de ID do Microsoft Entra, que inclui sua ID de locatário do Microsoft Entra.
Neste exemplo, esses valores são lidos do arquivo authentication.properties usando um leitor de propriedades no arquivo Config.java .
Passo a passo
As etapas a seguir fornecem um passo a passo da funcionalidade do aplicativo:
A primeira etapa do processo de entrada é enviar uma solicitação para o ponto de extremidade para seu
/authorize
locatário do Microsoft Entra ID. A instância MSAL4JConfidentialClientApplication
é usada para construir uma URL de solicitação de autorização. A aplicação redireciona o navegador para este URL, que é onde o utilizador inicia sessão.final ConfidentialClientApplication client = getConfidentialClientInstance(); AuthorizationRequestUrlParameters parameters = AuthorizationRequestUrlParameters.builder(Config.REDIRECT_URI, Collections.singleton(Config.SCOPES)) .responseMode(ResponseMode.QUERY).prompt(Prompt.SELECT_ACCOUNT).state(state).nonce(nonce).build(); final String authorizeUrl = client.getAuthorizationRequestUrl(parameters).toString(); contextAdapter.redirectUser(authorizeUrl);
A lista a seguir descreve os recursos desse código:
AuthorizationRequestUrlParameters
: Parâmetros que devem ser definidos para criar um AuthorizationRequestUrl.REDIRECT_URI
: Onde o Microsoft Entra ID redireciona o navegador - juntamente com o código de autenticação - depois de coletar as credenciais do usuário. Ele deve corresponder ao URI de redirecionamento no registro do aplicativo Microsoft Entra ID no portal do Azure.SCOPES
: Escopos são permissões solicitadas pelo aplicativo.- Normalmente, os três escopos são suficientes para receber uma resposta de token de
openid profile offline_access
ID. - A lista completa de escopos solicitados pelo aplicativo pode ser encontrada no arquivo authentication.properties . Você pode adicionar mais escopos, como
User.Read
.
- Normalmente, os três escopos são suficientes para receber uma resposta de token de
O usuário recebe um prompt de entrada pela ID do Microsoft Entra. Se a tentativa de entrada for bem-sucedida, o navegador do usuário será redirecionado para o ponto de extremidade de redirecionamento do aplicativo. Uma solicitação válida para este ponto de extremidade contém um código de autorização.
Em seguida, a
ConfidentialClientApplication
instância troca esse código de autorização por um token de ID e token de acesso do Microsoft Entra ID.// First, validate the state, then parse any error codes in response, then extract the authCode. Then: // build the auth code params: final AuthorizationCodeParameters authParams = AuthorizationCodeParameters .builder(authCode, new URI(Config.REDIRECT_URI)).scopes(Collections.singleton(Config.SCOPES)).build(); // Get a client instance and leverage it to acquire the token: final ConfidentialClientApplication client = AuthHelper.getConfidentialClientInstance(); final IAuthenticationResult result = client.acquireToken(authParams).get();
A lista a seguir descreve os recursos desse código:
AuthorizationCodeParameters
: Parâmetros que devem ser definidos para trocar o Código de Autorização por um ID e/ou token de acesso.authCode
: O código de autorização que foi recebido no ponto de extremidade de redirecionamento.REDIRECT_URI
: O URI de redirecionamento usado na etapa anterior deve ser passado novamente.SCOPES
: Os escopos usados na etapa anterior devem ser passados novamente.
Se
acquireToken
for bem-sucedida, as declarações de token serão extraídas. Se a verificação nonce passar, os resultados serão colocados emcontext
- uma instância deIdentityContextData
- e salvos na sessão. O aplicativo pode então instanciar aIdentityContextData
partir da sessão por meio de uma instância de sempre que precisar acessá-laIdentityContextAdapterServlet
, conforme mostrado no código a seguir:// parse IdToken claims from the IAuthenticationResult: // (the next step - validateNonce - requires parsed claims) context.setIdTokenClaims(result.idToken()); // if nonce is invalid, stop immediately! this could be a token replay! // if validation fails, throws exception and cancels auth: validateNonce(context); // set user to authenticated: context.setAuthResult(result, client.tokenCache().serialize());
Proteja as rotas
Para obter informações sobre como o aplicativo de exemplo filtra o acesso a rotas, consulte AuthenticationFilter.java. No arquivo authentication.properties, a app.protect.authenticated
propriedade contém as rotas separadas por vírgulas que somente usuários autenticados podem acessar, conforme mostrado no exemplo a seguir:
# for example, /token_details requires any user to be signed in and does not require special roles claim(s)
app.protect.authenticated=/token_details
Qualquer uma das rotas listadas nos conjuntos de regras separadas por vírgulas sob o app.protect.roles
também está fora dos limites para usuários autenticados não autenticados, conforme mostrado no exemplo a seguir. No entanto, essas rotas também contêm uma lista separada por espaço de associações de função de aplicativo: somente usuários com pelo menos uma das funções correspondentes podem acessar essas rotas após a autenticação.
# local short names for app roles - for example, sets admin to mean PrivilegedAdmin (useful for long rule sets defined in the next key, app.protect.roles)
app.roles=admin PrivilegedAdmin, user RegularUser
# A route and its corresponding <space-separated> role(s) that can access it; the start of the next route & its role(s) is delimited by a <comma-and-space-separator>
# this says: /admins_only can be accessed by PrivilegedAdmin, /regular_user can be accessed by PrivilegedAdmin role and the RegularUser role
app.protect.roles=/admin_only admin, /regular_user admin user
Âmbitos
Os escopos informam ao ID do Microsoft Entra o nível de acesso que o aplicativo está solicitando.
Com base nos escopos solicitados, o Microsoft Entra ID apresenta uma caixa de diálogo de consentimento ao usuário ao entrar. Se o usuário consentir com um ou mais escopos e obtiver um token, os escopos consentidos serão codificados no .access_token
Para os escopos solicitados pelo aplicativo, consulte authentication.properties. Esses três escopos são solicitados pela MSAL e fornecidos pelo ID do Microsoft Entra por padrão.
Mais informações
- Biblioteca de Autenticação da Microsoft (MSAL) para Java
- Plataforma de identidade da Microsoft
- Início Rápido: Registar uma aplicação na plataforma de identidade da Microsoft
- Noções básicas sobre experiências de consentimento de aplicativo do Microsoft Entra ID
- Compreender o consentimento do utilizador e do administrador
- Exemplos de código MSAL
- Como: Adicionar funções de aplicativo ao seu aplicativo e recebê-las no token
- Gerir atribuições de utilizador para uma aplicação no Microsoft Entra ID
Próximo passo
Implementar aplicativos Java WebSphere no WebSphere Tradicional em Máquinas Virtuais do Azure