jueves, 20 de octubre de 2016

Row Level Security

En SQL Server 2016 la seguridad a nivel de fila (Row Level Security) es una característica que permite un control más preciso al acceso a las filas de una tabla. Row Level Security le permite controlar fácilmente qué usuarios pueden acceder a los datos con total transparencia a la aplicación, restringiendo los datos en función de la identidad del usuario o contexto de seguridad.

En nuestro ejemplo contamos con la tabla Ordenes, de la cual necesitamos limitar el acceso a las filas y que cada usuario solo pueda ver las Ordenes que ingreso y no las de otros usuarios.

Create database TestRowLevel
go

Use TestRowLevel
go

--Creacion de tabla

Create table dbo.Ordenes
(
Codigo_Cliente int,
Nombre_Producto varchar(100),
Fecha datetime,
Cantidad int,
ProcesadoPor Varchar(10)
)          
go

 -- ingreso de datos de ejemplo

Insert into dbo.Ordenes
values(101,'Monitores','2016-08-11 00:34:51:090',100,'SOFIA')
Insert into dbo.Ordenes
values(102,'Teclados CORP','2016-01-08 19:44:51:090',700,'SOFIA')
Insert into dbo.Ordenes
values(103,'Memoria RAM','2015-08-19 19:44:51:090',1500,'SOFIA')
Insert into dbo.Ordenes
values(102,'Disco Duro','2014-08-19 19:44:51:090',1099,'CLAUDIA')
Insert into dbo.Ordenes
values(101,'Web Cam','2014-08-04 19:44:51:090',5600,'CLAUDIA')
Insert into dbo.Ordenes
values(103,'Ratones','2015-08-10 19:44:51:090',498,'HUGO')
Insert into dbo.Ordenes
values(102,'Cable HDMI','2015-04-17 19:44:51:090',999,'HUGO')
Insert into dbo.Ordenes
values(101,'Cable VGA','2015-08-21 19:44:51:090',543,'VICTOR')
Insert into dbo.Ordenes
values(103,'Conectores RJ45','2015-08-06 19:44:51:090',876,'VICTOR')
Insert into dbo.Ordenes
values(102,'Memory Stick','2015-08-26 19:44:51:090',665,'VICTOR')
go

--Creación de la función de predicado que filtra que Ordenes fueron realizadas por cada usuario, el Filtro será aplicada durante la ejecución de la consulta

Create Function dbo.fn_SeguridadOrdenes (@ProcesadoPor sysname)
returns table with Schemabinding
as
return select 1 as [fn_SeguridadOrdenes_result]
from
dbo.Ordenes
where @ProcesadoPor = user_name() 
go

--Creacion de la politica de seguridad al crearla aplicará la limitación de acceso a los usuarios

Create security Policy fn_seguridad
add Filter Predicate
dbo.fn_SeguridadOrdenes(ProcesadoPor)
on dbo.Ordenes
go

--creación de usuarios para prueba

Create user VICTOR without login;
Create user HUGO without login;
Create user CLAUDIA without login;
Create user SOFIA without login;

--asignación de permisos a los usuarios de prueba

GRANT SELECT ON dbo.Ordenes to CLAUDIA;
GRANT SELECT ON dbo.Ordenes to SOFIA;
GRANT SELECT ON dbo.Ordenes to HUGO;
GRANT SELECT ON dbo.Ordenes to VICTOR;

--Ejecución de una consulta en nombre de los usuarios para probar que cada usuario puede ver solo sus ordenes

Execute ('SELECT * FROM DBO.ORDENES') as user='VICTOR';
go
 


Execute ('SELECT * FROM DBO.ORDENES') as user='CLAUDIA';
go
 



Execute ('SELECT * FROM DBO.ORDENES') as user='SOFIA';
go

 
 

No hay comentarios:

Publicar un comentario