Desarrollo con las API de seguridad programática para aplicaciones web

Utilice esta información para proteger de forma programada las API para las aplicaciones web.

Antes de empezar

La seguridad programada la utilizan las aplicaciones que aplican seguridad cuando simplemente la seguridad declarada no es suficiente para expresar el modelo de seguridad de la aplicación.

Los métodos de seguridad de servlet authenticate, login, logout, getRemoteUser, isUserInRole y getAuthType son métodos de la interfaz javax.servlet.http.HttpServletRequest. Para obtener información más detallada acerca de estos métodos de seguridad de servlet, consulte el artículo Métodos de seguridad de servlet.
Nota:

Las API de logout, login y authenticate son nuevas para Java™ Servlet 3.0 en este release de WebSphere Application Server.

Puede configurar varias opciones para la autenticación web que determinen cómo interactúa el cliente web con los URI (Uniform Resource Identifier) protegidos y desprotegidos. Asimismo, puede especificar si WebSphere Application Server solicita información de autenticación básica al cliente web si falla la autenticación de certificados del cliente HTTPS. Para obtener más información, consulte el artículo Selección de un mecanismo de autenticación.

[z/OS]Puede habilitar un módulo de inicio de sesión para indicar qué clase de principal devuelven estas llamadas. Consulte el tema sobre cómo correlacionar el principal de un registro con un ID de usuario SAF utilizando un módulo de inicio de sesión JAAS (Java Authentication and Authorization Services) para obtener más información.

Cuando utilice el método isUserInRole, declare un elemento security-role-ref en el descriptor de despliegue con un subelemento role-name que contenga el nombre del rol que se pasa a este método o utilice la anotación @DeclareRoles. Puesto que los roles reales se crean durante la fase de ensamblaje de la aplicación, el desarrollador puede utilizar un rol lógico como nombre de rol y proporcionar las suficientes sugerencias al ensamblador en la descripción del elemento security-role-ref para enlazar dicho rol con el rol real. Durante el ensamblaje, el ensamblador crea un elemento role-link para enlazar el elemento role-name con el rol real. Es posible crear un elemento security-role-ref si se utiliza una herramienta de ensamblaje como Rational Application Developer. También puede crear el elemento security-role-ref durante la fase de ensamblaje mediante una herramienta de ensamblaje.

Procedimiento

  1. Añada los métodos de seguridad necesarios en el código del servlet.
  2. Cree un elemento security-role-ref con el campo role-name. Si no se crea el elemento security-role-ref durante el desarrollo, asegúrese de que se crea durante la fase de ensamblaje.

Resultados

Una aplicación de servlet protegida mediante programa.

Ejemplo

Estos pasos son necesarios para proteger una aplicación mediante programación. Esta acción resulta útil cuando es necesario que una aplicación web acceda a los recursos externos y desea controlar el acceso a los mismos mediante su propia tabla de autorizaciones (correlación de recursos externos con usuarios remotos). En este caso, utilice los métodos getUserPrincipal o getRemoteUser para obtener el usuario remoto y, a continuación, la aplicación puede consultar su propia tabla de autorización para realizar la autorización. La información del usuario remoto también puede ayudar a recuperar la información de usuario correspondiente de una fuente externa como, por ejemplo, una base de datos o un enterprise bean. Puede utilizar el método isUserInRole de modo similar.
Después del desarrollo, puede crear un elemento security-role-ref:
<security-role-ref>
   <description>Proporcionar indicaciones al ensamblador para enlazar este nombre de rol 
                con un rol real aquí<\description>
   <role-name>Mgr<\role-name>
</security-role-ref>
Durante el ensamblaje, el ensamblador crea un elemento role-link:
<security-role-ref>
   <description>Indicaciones proporcionadas por el desarrollador para correlacionar el nombre de 
                rol con role-link</description>
   <role-name>Mgr</role-name>
   <role-link>Manager</role-link>
</security-role-ref>
Los métodos de seguridad del servlet programados se pueden añadir a cualquiera de los métodos de servicio doGet, doPost, doPut, doDelete del servlet. En el ejemplo siguiente se muestra cómo se utiliza una API de seguridad mediante programa:
public void doGet(HttpServletRequest request, 
HttpServletResponse response) {

   ....
   // para finalizar la sesión del usuario actual
	 request.logout();
    
   // para iniciar sesión con un usuario nuevo
   request.login(“bob”,”bobpwd”)

   // obtener usuario remoto utilizando getUserPrincipal()
   java.security.Principal principal = request.getUserPrincipal();
   String remoteUser = principal.getName();
 
   // obtener usuario remoto utilizando getRemoteUser()
   remoteUser = request.getRemoteUser();

   // comprobar si al usuario remoto se le ha otorgado el rol Mgr
   boolean isMgr = request.isUserInRole("Mgr");

   // utilizar esta información en la forma que la necesite
   // la aplicación 
   ....
                  
}
Puede iniciar sesión mediante programación con un ID de usuario y una contraseña dentro de cualquiera de los métodos de servicio doGet, doPost, doPut y doDelete del servlet. En el ejemplo siguiente se muestra cómo se utiliza una API de inicio/finalización de sesión mediante programa:
public void doGet(HttpServletRequest request, 
HttpServletResponse response) {

   ....
   // para finalizar la sesión del usuario actual. Si todavía no se ha autenticado, no es necesario llamar al método logout().
   request.logout();
    
   // para iniciar sesión con un usuario nuevo
   request.login(“utle”,”mypwd”)

   // el sujeto utle de usuario ahora se establece en la hebra y la cookie SSO LTPA se establece en la respuesta
   ....
                  
}
Puede autenticarse mediante programa con una identidad diferente dentro de cualquiera de los métodos de servicio doGet, doPost, doPut y doDelete del servlet. En este ejemplo, si el servlet Web está configurado para utilizar basicAuth, el servidor web devuelve un código de respuesta 401, se muestra el indicador de inicio de sesión y entonces puede especificar el ID de usuario y la contraseña para autenticarse. En el ejemplo siguiente se muestra cómo se utiliza una API de inicio/finalización de sesión mediante programa:
public void doGet(HttpServletRequest request, 
HttpServletResponse response) {

   ....
   // para finalizar la sesión del usuario actual. Si todavía no se ha autenticado, no es necesario llamar al método logout().
    
   // para iniciar sesión con un usuario nuevo
   request.authenticate(response);

   // el sujeto de usuario nuevo se establece en la hebra y la cookie SSO LTPA se establece en la respuesta
   ....
                  
}
Al desarrollar módulos de Servlet 3.0, el valor del argumento rolename en el método isCallerInRole puede definirse mediante anotaciones Java en lugar de la declaración de elementos security-role-ref en el descriptor de despliegue.
@javax.annotation.security.DeclareRoles("Mgr")
public void doGet(HttpServletRequest request, 
HttpServletResponse response) {

   ....

   // obtener usuario remoto utilizando getUserPrincipal()
   java.security.Principal principal = request.getUserPrincipal();
   String remoteUser = principal.getName();
 
   // obtener usuario remoto utilizando getRemoteUser()
   remoteUser = request.getRemoteUser();

   // comprobar si al usuario remoto se le ha otorgado el rol Mgr
   boolean isMgr = request.isUserInRole("Mgr");

   // utilizar esta información en la forma que la necesite
   // la aplicación 
   ....
                  
}

El siguiente ejemplo ilustra una aplicación web o un servlet que utiliza el modelo de seguridad programada.

Este ejemplo ilustra un uso determinado y no necesariamente el único uso del modelo de seguridad programada. La aplicación puede utilizar la información que devuelven los métodos getUserPrincipal, isUserInRole y getRemoteUser de cualquier otro modo que sea significativo para esa aplicación. Siempre que sea posible, utilice el modelo de seguridad declarativa.

File : 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";
  	
        	
        // obtener usuario remoto utilizando getUserPrincipal()
        java.security.Principal principal = request.getUserPrincipal();
        String remoteUserName = "";
        if( principal != null )
         		remoteUserName = principal.getName();
// obtener usuario remoto utilizando getRemoteUser()
        String remoteUser = request.getRemoteUser();

        // comprobar si al usuario remoto se le ha otorgado el rol Mgr
        boolean isMgr = request.isUserInRole("Mgr");

        // mostrar el nombre de usuario Hello para los gestores y 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();
		
				// muestra "Hello" para los usuarios corrientes 
        // y muestra "Hello nombre de usuario" para los gestores y "bob".
        response.getOutputStream().write(bytes);
	}

}
Después de desarrollar el servlet, puede crear una referencia de rol de seguridad para el servlet HelloServlet, tal como se muestra en el ejemplo siguiente:
<security-role-ref>
     <description> </description>
     <role-name>Mgr</role-name>
</security-role-ref>

Qué hacer a continuación

Después de desarrollar una aplicación, utilice una herramienta de ensamblaje para crear roles y enlazar los roles reales con los nombres de rol de los elementos security-role-ref. Consulte información sobre la protección de aplicaciones Web mediante una herramienta de ensamblaje.

Icon that indicates the type of topic Task topic



Timestamp icon Last updated: last_date
http://www14.software.ibm.com/webapp/wsbroker/redirect?version=cord&product=was-nd-mp&topic=tsec_web
File name: tsec_web.html