31/10/2008
10/11/2008
| Atributo | Tipo | BBDD | Comentario |
| idUsuario (PK) | numérico | not null | Código del usuario |
| login (UK) | texto | not null | Login en la aplicación |
| password | texto | Null | Contraseña del usuario |
| nombre | texto | Null | Nombre del usuario |
| apellido | texto | Null | Apellidos del usuario |
| ... | Null | Resto de datos personales... | |
| idPerfil (FK) | numérico | not null | Id del Perfil que define los permisos del usuario. |
| Atributo | Tipo | BD | Comentario |
| idPerfil (PK) | numérico | not null | Código del perfil |
| perfil | texto | not null | Nombre del perfil |
| Atributo | Tipo | BBDD | Comentario |
| idTipoAcceso (PK) | numérico | not null | Código del tipo de Acceso |
| codigo | Numérico | not null | Código constante para identificar el tipo de acceso |
| tipoAcceso | texto | not null | Descripción del tipo de acceso |
| Atributo | Tipo | BBDD | Comentario |
| idSeccionAplicacion (PK) | numérico | not null | Código de la Sección de la Aplicación |
| codigo | texto | not null | Código constante para identificar la sección |
| seccionAplicacion | texto | not null | Descripción de la sección |
| Atributo | Tipo | BBDD | Comentario |
| idPermiso (PK) | numérico | not null | Código del permiso |
| idTipoAcceso(FK) | numérico | not null | Código del tipo de acceso |
| idSeccionAplicacion(FK) | numérico | not null | Código de la sección de la aplicación |
| idPerfil(FK) | numérico | not null | Código del perfil |
public abstract class RestriccionAction extends Action
{
public ActionForward execute(.....)
{
doRestriccion(…);
return _execute(…);
}
public abstract ActionForward _execute(….);
private void doRestriccion(……) throws AccesoNoPermitidoException
{
/* Este metodo realiza las comprobaciones de acceso con
el perfil del usuario que haya en sesión */
}
}
public class CuarquierCosaAction extends RestriccionAction
{
public ActionForward _execute(.....)
{
/* Este es el método execute que tenía el Action, pero le cambiamos el nombre
para que se ejecute el de la clase padre que implementa la restricción */
}
}
public class SecurityActionMapping extends ActionMapping
{
private String zone = null;
public String getApplicationZone()
{
return zone;
}
public void setApplicationZone(String newZone)
{
zone = newZone;
}
}
path=”...”
[...]
className="ruta_de_paquetes.SecurityActionMapping"
[...] >
property="applicationZone"
value="CODIGO_DE_SECCION" />
[...] />
>
public class AccesoNoPermitidoException extends Exception
{
public void printStackTrace()
{
super.printStackTrace();
}
}
public class ExceptionHandler extends ExceptionHandler
{
public ActionForward execute(Exception exception, ExceptionConfig config,
ActionMapping mapping, ActionForm form, HttpServletRequest request,
HttpServletResponse response) throws ServletException
{
if(exception.getClass().equals(AccesoNoPermitidoException.class))
{
return mapping.findForward("permisoDenegado");
}
else
{
request.setAttribute("exception",exception);
return mapping.findForward("error");
}
}
}
>
key="lang.exception" type="java.lang.Exception"
handler="ruta_de_paquetes.ExceptionHandler" />
>
>
name="error" path="/error.jsp" contextRelative="true" />
name="permisoDenegado" path="/permisoDenegado.jsp" contextRelative="true" />
>
Etiquetas: j2ee, Struts, perfiles, permisos, Seguridad, acceso
Dos cosas:
1. No seas tan modesto: Pon tu nombre en algún sitio :)
2. Después de darle bastantes vueltas al asunto yo he llegado a la conclusión de que no existe realmente necesidad de diferenciar entre "área de acceso" y "tipo de operación". Es posible simplificar si plantea como "operación".
Es decir, donde tú tendrías, por poner un ejemplo, las áreas de socios y de cursos, y los tipos de operaciones de leer, alta, baja y modificación, se podría tener viendolo de otro modo, las operaciones "ver socios, alta de socio, baja de socio, alta de curso, modificar curso, etc".
¿Por qué -qué ventaja tiene, si es que tiene alguna- plantearlo así? ¿No es una especie de desnormalización?
Puede verse como una especie de desnormalización, pero es que en realidad, el concepto de "área de acceso" está íntimamente ligado al de las operaciones. Quiero decir, conceptualmente existe una relación de dependencia bastante fuerte que, al separar ambos, da lugar a determinadas situaciones que no aportan nada. Por ejemplo, ¿qué sentido tiene tener acceso a un área si no se tiene permiso para ningún tipo de operación en ella? Ninguno. En realidad, lo que ocurre es que el propio acceso al área ya es un tipo de operación, o mejor dicho una operación en sí misma.
Claro... esto tiene una pega. El sistema de tipos de operaciones facilita bastante la asignación de permisos masivamente (masivamente en la dimensión de las operaciones, no en la de los usuarios). El sistema de operaciones hace algo más sencilla la asignación granulada de permisos pero no ayuda particularmente a asignar, por ejemplo, "todos los permisos de lectura". (Se puede resolver mediante algún tipo de metadato o con plantillas, pero es menos limpio y elegante, lo reconozco) (También hay que tener en cuenta que mientras que la comprobación de permisos se va a realizar en toda la aplicación, este problema sólo afecta al momento de definir roles y asignarles los permisos, una operación de administración)
Si alguien me puediera explicar lo siguiente .....
No sé cómo hacerlo, no entiendo muy bien la parte de:
"A partir de ahora, el parámetro de tipo ActionMapping del método execute de los Action será de tipo SecurityActionMapping (podremos hacer un casting dentro del método a un objeto de esta clase con el objeto de entrada). ..."
Muchas gracias
Al inicio del Action tuyo, tienes que poner:
SecurityActionMapping securityMapping = (SecurityActionMapping)mapping;
A mi me da un problema cuando intento levantar el servidor:
java.lang.NoSuchMethodException: Bean has no property named seccionAplicacion
pero tengo el Bean y el struts-config.xml perfecto.
Si alguien me puede ayudar...
Muchas gracias
Hola,
Y no sería más sencillito utilizar un Filtro y nombrar adecuadamente los actions? Así, todos los acabados en *Admin pues se exigiría el rol de administrador, *User de usuario, ... esto convinado con JAAS creo q simplifica bastante el tema.
Si utilizar Spring el módulo Acegi es la caña.
Saludos
Se deberia de controlar el permiso cada vez que cambias de pagina (de action).
Haciendolo con un filtro solo lo comprobarias una vez al entrar a la aplicacion no?
Puedes concretar un poco?
Gracias
"Haciendolo con un filtro solo lo comprobarias una vez al entrar a la aplicacion no?"
No sé de dónde has sacado esa idea, pero no. Los filtros se ejecutan en cada petición. Por eso se llaman filtros.
Otra solucion es usar un Controller.
He resuelto el problema que me daba a mi.
Tenia puesto en el struts-config.xml, dentro de cada tag , la palabra "classname" en lugar de "className"
Yo lo que uso y definimos hace bastante es una serie de interfaces a implementar por cada aplicacion, que:
.- Te devuelvan si un usuario/clave es correcto
.- Te devuelvan si un usuario tiene permiso para realizar una accion (rol)
.- Te devuelvan la accion(rol) requerido para cada peticion (pudiendo decidirlo en funcion de parametros, el contexto, la fase lunar... :) )
Implementando esas interfaces, tenemos aplicaciones que tienen un par de usuarios en ficheros de tecto y solo tienen permisos simples, aplicaciones con usuarios en BDD y permisos que cambian dinamicamente en funcion de los parametros de la peticion... y algunos que comprueban datos del contexto, hora/otros parametros, para decidir si tiene o no permisos el usuario para eso.
Todo independiente de la logica de la aplicacion y sin recompilar ninguna clase de logica para protegerla o no, pudiendo reutilizar la misma clase para operaciones protegidas o no.
Debemos estar contentos por que hace años que lo usamos :D
Definitivamente me quedo con Acegi (Spring security), es independiente de struts y no es intrusivo, que feo se mira (diseño) eso de extends RestrictionAction, SecurityActionMapping, AccesoNoPermitidoException, yo he logrado integrar Acegi con struts1 y struts2 y es completemente flexible y te ofrece las mejores prácticas para seguridad de aplicaciones JEE, no hay que inventar mucho, así que muy bueno el tutorial para aprender a extender y personalizar struts, pero muy obsoleto la aplicabilidad.
Yo creo que struts ya trae integrado un modulo para conectarse con los roles de JAAS que defines en el web.xml, los famosos contrains.
El filtro funciona bastante bien para darse cuenta si el usuario se encuentra logueado o cargar los permisos del mismo.
Por otro lado se puede hacer un taglib para determinar si se debe o no mostrar o permitir la edicion de los elementos de la pagina.
Tengo en cola probar Acegi a ver que tal.
En cuanto a la solucion, pues si ya la habia elegido, pero el problema que siento en utilizar jerarquias de actions, es que te amarras demasiado a un controller especifico, pues por ejemplo si quisieras pasar paulatinamente a SpringMVC, se te va ser mas complicado, pues tambien tiene que migrar el codigo base, en vez de solo la logica de control del action.
En fin, es mi humilde opinion,
salu2
J
hay manuales de jsp estoy ingresando en l tema por favor gracias
Escribe tu comentario