Desenvolvendo com APIs de Segurança Programática para Aplicativos da Web

Utilize essas informações para proteger programaticamente APIs para aplicativos da Web.

Antes de Iniciar

A segurança programática é utilizada por aplicativos cientes de segurança quando a segurança declarativa por si só não é suficiente para expressar o modelo de segurança do aplicativo.

Os métodos de segurança de servlet authenticate, login, logout, getRemoteUser, isUserInRole e getAuthType são métodos da interface javax.servlet.http.HttpServletRequest. Para obter informações mais detalhadas sobre esses métodos de segurança de servlet, leia o artigo Métodos de Segurança de Servlet.
Nota:

As APIs de logout, login e autenticação são novas para Java™ Servlet 3.0 nesse release do WebSphere Application Server.

É possível configurar várias opções para autenticação da Web que determinam como o Web client interage com Identificador Uniforme de Recursos protegidos e desprotegidos. Também, você pode especificar se o WebSphere Application Server desafia o Web client quanto às informações básicas de autenticação se a autenticação do certificado para cliente HTTPS falhar. Para obter informações adicionais, consulte o artigo Selecionando um Mecanismo de Autenticação.

[z/OS]É possível ativar um módulo de login para indicar qual classe principal é retornada por essas chamadas. Consulte o tópico sobre como mapear um principal de registro para um ID do usuário do System Authorization Facility usando um módulo de login de Java Authentication and Authorization Services para obter mais informações.

Quando o método isUserInRole é usado, declare um elemento security-role-ref no descritor de implementação com um subelemento de nome da função contendo o nome da função que é transmitida para esse método, ou utilize a anotação de @DeclareRoles. Como funções reais são criadas durante o estágio de montagem do aplicativo, é possível utilizar uma função lógica como o nome da função e fornecer dicas suficientes ao assembler na descrição do elemento security-role-ref para vincular essa função à função real. Durante a montagem, o assembler cria um sub elemento role-link para vincular o nome da função à função em si. Criação de um elemento security-role-ref é possível se uma ferramenta do conjunto, como o Rational Application Developer, for usada. Também é possível criar o elemento security-role-ref durante o estágio de montagem utilizando uma ferramenta de montagem.

Procedimento

  1. Adicione os métodos de segurança requeridos ao código do servlet.
  2. Crie um elemento security-role-ref com o campo role-name. Se um elemento security-role-ref não for criado durante o desenvolvimento, certifique-se de que seja criado durante o estágio de montagem.

Resultados

Um aplicativo de servlet protegido através de programação.

Exemplo

Essas etapas são necessárias para proteger um aplicativo programaticamente. Essa ação é particularmente útil quando um aplicativo da Web precisa acessar recursos externos e deseja controlar o acesso a recursos externos utilizando sua própria tabela de autorizações (mapeamento de recurso externo para usuário remoto). Nesse caso, utilize os métodos getUserPrincipal ou getRemoteUser para obter o usuário remoto, em seguida o aplicativo pode consultar sua própria tabela de autorizações para executar a autorização. As informações do usuário remoto também podem ajudar a recuperar as informações do usuário correspondente de uma origem externa, como um banco de dados ou de um bean corporativo. É possível utilizar o método isUserInRole de uma maneira semelhante.
Após o desenvolvimento, é possível criar um elemento security-role-ref:
<security-role-ref>
   <description>Fornece dicas ao assembler para vincular esse nome de função 
                a uma função real aqui<\description>
   <role-name>Mgr<\role-name>
</security-role-ref>
Durante a montagem, o assembler cria um elemento role-link:
<security-role-ref>
   <description>Dicas fornecidas pelo desenvolvedor para mapear o nome da função 
                para role-link</description>
   <role-name>Mgr</role-name>
   <role-link>Manager</role-link>
</security-role-ref>
É possível incluir métodos de segurança programática do servlet dentro de quaisquer métodos de serviço doGet, doPost, doPut e doDelete do servlet. O exemplo a seguir demonstra como utilizar uma API de segurança programática:
public void doGet(HttpServletRequest request, 
HttpServletResponse response) {

   ....
   // efetuar logoff do usuário atual
	 request.logout();
    
   // efetuar login com um novo usuário
   request.login(“bob”,”bobpwd”)

   // obter o usuário remoto utilizando getUserPrincipal()
   java.security.Principal principal = request.getUserPrincipal();
   String remoteUser = principal.getName();
 
   // obter o usuário remoto utilizando getRemoteUser()
   remoteUser = request.getRemoteUser();

   // verificar se o usuário remoto obteve a função de Mgr
   boolean isMgr = request.isUserInRole("Mgr");

   // utilize as informações acima de qualquer maneira necessária ao 
   // aplicativo 
   ....
                  
}
É possível efetuar login programático com um ID do usuário e senha dentro de qualquer método de serviço doGet, doPost, doPut e doDelete do servlet. O exemplo a seguir retrata o uso de API de login/logout programático:
public void doGet(HttpServletRequest request, 
HttpServletResponse response) {

   ....
   // efetuar logout do usuário atual. Se você ainda não estiver
autenticado, então não precisa chamar o método logout().
   request.logout();
    
   // efetuar login com um novo usuário
   request.login(“utle”,”mypwd”)

   // o assunto utle do usuário agora definido no encadeamento e
o cookie de LTPA SSO é definido na resposta
   ....
                  
}
É possível autenticar programaticamente com uma identidade diferente dentro de quaisquer métodos de serviço doGet, doPost, doPute doDelete do servlet. Nesse exemplo, se o servlet da Web estiver configurado para usar basicAuth, o servidor da Web retorna um código de resposta 401, o prompt de login é exibido e é possível digitar o ID do usuário e senha para autenticar-se. O exemplo a seguir retrata o uso de API de login/logout programático:
public void doGet(HttpServletRequest request, 
HttpServletResponse response) {

   ....
   // efetuar logout do usuário atual. Se você ainda não estiver
autenticado, então não precisa chamar o método logout().
    
   // efetuar login com um novo usuário
   request.authenticate(response);

   // o assunto de novo usuário agora definido no encadeamento e o
cookie de LTPA SSO é definido na resposta
   ....
                  
}
Quando desenvolver módulos de Servlet 3.0, o valor do argumento rolename no método isCallerInRole pode ser definido utilizando as anotações Java em vez de declarar elementos security-role-ref no descritor de implementação.
@javax.annotation.security.DeclareRoles("Mgr")
public void doGet(HttpServletRequest request, 
HttpServletResponse response) {

   ....

   // obter o usuário remoto utilizando getUserPrincipal()
   java.security.Principal principal = request.getUserPrincipal();
   String remoteUser = principal.getName();
 
   // obter o usuário remoto utilizando getRemoteUser()
   remoteUser = request.getRemoteUser();

   // verificar se o usuário remoto obteve a função de Mgr
   boolean isMgr = request.isUserInRole("Mgr");

   // utilize as informações acima de qualquer maneira necessária ao 
   // aplicativo 
   ....
                  
}

O exemplo a seguir retrata um aplicativo da Web ou servlet utilizando o modelo de segurança programática.

Esse exemplo ilustra um uso e não necessariamente o único uso do modelo de segurança programática. O aplicativo pode utilizar as informações que são retornadas pelos métodos getUserPrincipal, isUserInRole e getRemoteUser de qualquer outra maneira que seja significativa para esse aplicativo. Utilize o modelo de segurança declarativa sempre que possível.

Arquivo : HelloServlet.java

public class HelloServlet extends javax.servlet.http.HttpServlet {

	public void doPost(
		javax.servlet.http.HttpServletRequest request,
		javax.servlet.http.HttpServletResponse response)
		throws javax.servlet.ServletException, java.io.IOException {
	}
public void doGet(
		javax.servlet.http.HttpServletRequest request,
		javax.servlet.http.HttpServletResponse response)
		throws javax.servlet.ServletException, java.io.IOException {
			
        String s = "Hello";
  	
        	
        // obtenha o usuário remoto utilizando getUserPrincipal()
        java.security.Principal principal = request.getUserPrincipal();
        String remoteUserName = "";
        if( principal != null )
         	remoteUserName = principal.getName();
// obtenha o usuário remoto utilizando getRemoteUser()
        String remoteUser = request.getRemoteUser();

        // verifique se o usuário remoto possui função de Mgr
        boolean isMgr = request.isUserInRole("Mgr");

        // display Hello username for managers and bob. 
        if ( isMgr || remoteUserName.equals("bob") )
            s = "Hello " + remoteUserName;

		 String message =  "<html> \n" +
            		"<head><title>Hello Servlet</title></head>\n" +
      			"<body> /n +"
				"<h1> "  +s+ </h1>/n " + 
		byte[] bytes = message.getBytes();
		
		// exibe "Hello" para usuários habituais 
        // e exibe "Nome do usuário Hello" para gerenciadores e "bob".
        response.getOutputStream().write(bytes);
	}

}
Depois de desenvolver o servlet, é possível criar uma referência da função de segurança para o servlet HelloServlet, conforme mostrado no exemplo a seguir:
<security-role-ref>
     <description> </description>
     <role-name>Mgr</role-name>
</security-role-ref>

O que Fazer Depois

Depois de desenvolver um aplicativo, utilize uma ferramenta de montagem para criar funções e para vincular as funções reais aos nomes de funções nos elementos security-role-ref. Consulte as informações sobre proteção de aplicativos da web usando uma ferramenta de montagem.

Ícone que indica o tipo de tópico Tópico de Tarefa



Ícone de registro de data e hora Última atualização: last_date
http://www14.software.ibm.com/webapp/wsbroker/redirect?version=cord&product=was-nd-mp&topic=tsec_web
Nome do arquivo: tsec_web.html