Desarrollo con las API programáticas para aplicaciones EJB
Utilice este tema para proteger programáticamente las aplicaciones EJB (Enterprise JavaBeans).
Acerca de esta tarea
- IsCallerInRole(Serie de nombre de rol): devuelve true si al emisor del bean se le ha otorgado el rol de seguridad especificado mediante el nombre de rol. Si al emisor no se le otorga el rol especificado o si no está autenticado, devuelve false. Si al rol especificado se le otorga el acceso Todos, siempre devuelve el valor true.
- getCallerPrincipal: devuelve el objeto java.security.Principal que contiene el nombre del emisor del bean. Si el emisor no está autenticado, devuelve un principal que contiene un nombre no autorizado.
Puede habilitar un módulo de inicio de sesión para indicar qué clase de principal devuelven estas llamadas.
Cuando se utiliza el método isCallerInRole, declare un elemento security-role-ref en el descriptor de despliegue con un role-name que sea un subelemento que contenga el nombre de rol que se ha pasado a este método. 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 un rol real. Durante el ensamblaje, el ensamblador crea un subelemento 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 módulo EJB.
- Cree un elemento security-role-ref con un campo de nombre de rol para todos los nombres de roles que se utilicen en el método isCallerInRole(). 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
El uso de las funciones del modelo de seguridad de Java EE para especificar de forma declarativa políticas de seguridad es útil cuando una aplicación EJB desea acceder a recursos externos así como controlar el acceso a los mismos mediante su propia tabla de autorizaciones (correlación de recurso externo con usuarios). En este caso, utilice el método getCallerPrincipal para obtener la identidad del emisor y, a continuación, la aplicación puede consultar su propia tabla de autorización para realizar la autorización. Identificar al emisor también puede ayudar a recuperar la información de usuario correspondiente de una fuente externa como, por ejemplo, una base de datos u otro enterprise bean. Puede utilizar el método isCallerInRole de modo similar.
<security-role-ref>
<description>Proporcionar indicaciones al ensamblador para enlazar este role-name al
rol real aquí<\description>
<role-name>Mgr<\role-name>
</security-role-ref>
<security-role-ref>
<description>Indicaciones proporcionadas por el desarrollador para
correlacionar role-name con role-link</description>
<role-name>Mgr</role-name>
<role-link>Manager</role-link>
</security-role-ref>
public class aSessionBean implements SessionBean {
.....
// SessionContext extiende EJBContext. Si es un bean de entidad, usar EntityContext
javax.ejb.SessionContext context;
// El contenedor EJB invocará el siguiente método
// automáticamente
public void setSessionContext(javax.ejb.SessionContext ctx) {
context = ctx; // guardar el contexto del bean de sesión
}
....
private void aBusinessMethod() {
....
// obtener el emisor del bean utilizando getCallerPrincipal()
java.security.Principal principal = context.getCallerPrincipal();
String callerId= principal.getName();
// comprobar si el emisor del bean tiene el rol Mgr
boolean isMgr = context.isCallerInRole("Mgr");
// utilizar la información anterior en la forma que la necesite
//la aplicación
....
}
....
}
@javax.annotation.security.DeclareRoles("Mgr")
@Stateless // la anotación se utiliza para indicar un bean de sesión
public class aSessionBean implements MyBusinessInterface { //no tiene que ampliar la interfaz sessionbean
.....
// SessionContext extiende EJBContext. En EJB 3.0 utilice la anotación Resource para insertar contexto
@Resource
javax.ejb.SessionContext context; }
....
private void aBusinessMethod() {
....
// obtener el emisor del bean utilizando getCallerPrincipal()
java.security.Principal principal = context.getCallerPrincipal();
String callerId= principal.getName();
// comprobar si el emisor del bean tiene el rol Mgr
boolean isMgr = context.isCallerInRole("Mgr");
// utilizar la información anterior en la forma que la necesite
//la aplicación
....
}
....
}