Control de acceso sensible al contexto
En AbanQ v3 se han hecho muchas mejoras en seguridad y en el control de acceso, una de estas mejoras se puede probar en los últimas publicaciones de la versión 2.3; Control de acceso sensible al contexto.
La mayoría de los sistemas de control de acceso son estáticos e invariantes con los datos, es decir insensibles al contexto, esto significa que nosotros definiremos reglas del tipo “El usuario Eladio no puede modificar los clientes y no puede ver las cantidades totales de las facturas”. Esta regla se aplica de forma sistemática para todos los clientes y para todas la facturas.
Pero en muchos casos esas reglas de control de acceso necesitan ser aplicadas según el valor de ciertos datos, es decir queremos que sean sensibles al contexto, de tal manera que podamos definir reglas del tipo “El usuario Eladio no puede modificar los clientes de Albacete, y puede ver las cantidades totales de las facturas excepto las que corresponden a los tres meses anteriores”.
Bien pues este tipo de reglas de control de acceso sensibles al contexto ya es posible usarlas en AbanQ, aún de forma limitada en la versión 2.3 y con toda su potencia en la nueva versión.
Ahora cada FLSqlCursor tiene su control de acceso para tablas ( FLAccessControlTable ) que aplica al evaluar una condición cuando se carga un nuevo registro. Este control de acceso se puede definir mediante los scripts, las funciones que podemos usar son estas:
/**
Establece el acceso global para la tabla, ver FLSqlCursor::setAcosCondition().
Este será el permiso a aplicar a todos los campos por defecto
@param ac Permiso global; p.e.: “r-", “-w”
*/
void setAcTable( const QString & ac ) ;
/**
Establece la lista de control de acceso (ACOs) para los campos de la tabla, , ver FLSqlCursor::setAcosCondition().
Esta lista de textos deberá tener en sus componentes de orden par los nombres de los campos,
y en los componentes de orden impar el permiso a aplicar a ese campo,
p.e.: “nombre", “r-", “descripcion", “–", “telefono", “rw",…
Los permisos definidos aqui sobreescriben al global.
@param acos Lista de cadenas de texto con los nombre de campos y permisos.
*/
void setAcosTable( const QStringList & acos );
/**
Establece la condicion que se debe cumplir para aplicar el control de acceso.
Para cada registro se evalua esta condicion y si se cumple, aplica la regla
de control de acceso establecida con FLSqlCursor::setAcTable y FLSqlCursor::setAcosTable.
Ejemplos:
setAcosCondition( “nombre", VALUE, “pepe” ); // valueBuffer( “nombre” ) == “pepe”
setAcosCondition( “nombre", REGEXP, “pe*” ); // QRegExp( “pe*” ).exactMatch( valueBuffer( “nombre” ).toString() )
setAcosCondition( “sys.checkAcos", FUNCTION, true ); // call( “sys.checkAcos” ) == true
@param cond Tipo de evaluacion;
VALUE compara con un valor fijo
REGEXP compara con una expresion regular
FUNCTION compara con el valor devuelto por una funcion de script
@param condName Si es vacio no se evalua la condicion y la regla no se aplica nunca.
Para VALUE y REGEXP nombre de un campo.
Para FUNCTION nombre de una funcion de script. A la función se le pasa como
argumento el objeto cursor.
@param condVal Valor que hace que la condicion sea cierta
*/
void setAcosCondition( const QString & condName, int cond, const QVariant & condVal );
Con estas tres funciones podemos definir cualquier regla de control de acceso a nivel de tabla y que tengan en cuenta el valor de los datos de cada uno de los registros. Se puede establecer un permiso global para la tabla y luego permisos concretos para campos que sobreescriben el global. Por ejemplo este código en masterfacturascli.qs, permite editar el nombre y oculta el cif para registros bloqueados ( campo editable = false ).
function interna_init()
{
var cur = this.cursor();
// Permisos concretos para campos
var acos = new Array( “nombrecliente", “rw", “cifnif", “–” );
cur.setAcTable( “r-” ); // Permiso global sólo lectura
cur.setAcosTable( acos ); // Lista permisos de campos
// La condicion para aplicar la regla es que el campo editable tenga el
// valor false
cur.setAcosCondition( “editable", cur.Value, false );
…….
……
}
Básicamente la definición de reglas sensibles al contexto se reduce en dar un permiso global, permisos concretos de campos y una condición que puede ser, comparar con un valor, con una expresión regular o el resultado que devuelve una funcion de script indicada, a esta función se le pasa el cursor, el contexto, actual de datos que condicionará el que se aplique o no una regla.
