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.
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.
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
- Añada los métodos de seguridad necesarios en el código del servlet.
- 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
Ejemplo
<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>
<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>
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
....
}
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
....
}
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
....
}
@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);
}
}
<security-role-ref>
<description> </description>
<role-name>Mgr</role-name>
</security-role-ref>