Modificar en función de los permisos de un usuario.

03/01/2004 - 14:16 por Adam Viussà | Informe spam
Os presento esta procedure que, en función de los permisos de un usuario, se
modificaran los campos en los que el usuario tenga permiso y, se devolverá
un String con los nombres de campo que el usuario no tenga permiso...

Al principio creo que està bién pero no me convence el final de ir
comentando campo por campo de la tabla.
Por esto quería interntarlo hacer con la Stored Procedure de sistema
"SP_SPKEYS" que retorna los campos
que son PK y, de esta forma hacer un cursor solo con las Columnas que no son
PK para poder comprobar
si el usuario pueder hacer UPDATE o no...

haber como lo veis...

Gracias.
/*
Esta tabla indica los bits utilizados para los permisos de
objetos quese devuelven cuando sólo se especifica objectid.
Bit(dec) Bit(hex) Permiso de la instrucción
1 0x1 SELECT ALL
2 0x2 UPDATE ALL
4 0x4 REFERENCES ALL
8 0x8 INSERT
16 0x10 DELETE
32 0x20 EXECUTE (sólo procedimientos)
4096 0x1000 SELECT ANY (al menos una columna)
8192 0x2000 UPDATE ANY
16384 0x4000 REFERENCES ANY
Esta tabla muestra los bits utilizados para los permisos de
objeto en lo referente a columnas, devueltos cuando se
especifican objectid y también column.
Bit(dec) Bit(hex) Permiso de la instrucción
1 0x1 SELECT
2 0x2 UPDATE
4 0x4 REFERENCES
*/
CREATE PROCEDURE [dbo].[MNU_OPCIONS_M]
@permisos VARCHAR(512) OUTPUT,
@id_gestio INT,
@id_mnu INT,
@p_id_gestio INT,
@p_id_mnu INT,
@apareix_a_fitxa INT,
@apareix_a_mnu INT,
@win_frm_accio VARCHAR(256),
@web_frm_accio VARCHAR(256)
AS
DECLARE @TAULA VARCHAR(512)
DECLARE @SEL VARCHAR(500)
SET @TAULA = 'MNU_OPCIONS'
IF PERMISSIONS(OBJECT_ID(@TAULA)) & 0x2 = 0x2
BEGIN
UPDATE a
SET a.p_id_gestio = @p_id_gestio,
a.p_id_mnu = @p_id_mnu,
a.apareix_a_fitxa = @apareix_a_fitxa,
a.apareix_a_mnu = @apareix_a_mnu,
a.win_frm_accio = @win_frm_accio,
a.web_frm_accio = @web_frm_accio
FROM [dbo].[MNU_OPCIONS] AS a
WHERE a.id_gestio = @id_gestio
AND a.id_mnu = @id_mnu
SET @permisos = ''
RETURN
END
ELSE
IF PERMISSIONS(OBJECT_ID(@TAULA)) & 0x2000 = 0x2000
BEGIN
SET @SEL = 'UPDATE a SET '
SET @permisos = ''
IF PERMISSIONS(OBJECT_ID(@TAULA),'p_id_gestio') & 0x2 = 0x2
SET @SEL = @SEL + 'a.p_id_gestio = ' + CAST(@p_id_gestio AS VARCHAR) +
', '
ELSE
SET @permisos = @permisos + 'p_id_gestio,'
IF PERMISSIONS(OBJECT_ID(@TAULA),'p_id_mnu') & 0x2 = 0x2
SET @SEL = @SEL + 'a.p_id_mnu = ' + CAST(@p_id_mnu AS VARCHAR) + ', '
ELSE
SET @permisos = @permisos + 'p_id_mnu,'
IF PERMISSIONS(OBJECT_ID(@TAULA),'apareix_a_fitxa') & 0x2 = 0x2
SET @SEL = @SEL + 'a.apareix_a_fitxa = ' + CAST(@apareix_a_fitxa AS
VARCHAR)+ ', '
ELSE
SET @permisos = @permisos + 'apareix_a_fitxa,'
IF PERMISSIONS(OBJECT_ID(@TAULA),'apareix_a_mnu') & 0x2 = 0x2
SET @SEL = @SEL + 'a.apareix_a_mnu = ' + CAST(@apareix_a_mnu AS
VARCHAR)+ ', '
ELSE
SET @permisos = @permisos + 'apareix_a_mnu,'
IF PERMISSIONS(OBJECT_ID(@TAULA),'win_frm_accio') & 0x2 = 0x2
SET @SEL = @SEL + 'a.win_frm_accio = ''' + @win_frm_accio + ''', '
ELSE
SET @permisos = @permisos + 'win_frm_accio,'
IF PERMISSIONS(OBJECT_ID(@TAULA),'web_frm_accio') & 0x2 = 0x2
SET @SEL = @SEL + 'a.web_frm_accio = ''' + @web_frm_accio + ''', '
ELSE
SET @permisos = @permisos + 'web_frm_accio,'
IF @SEL = 'UPDATE a SET '
GOTO ACCES_A_RES
SET @SEL = LEFT(@SEL,LEN(@SEL)-1)
SET @permisos = LEFT(@permisos,LEN(@permisos)-1)
SET @SEL = @SEL + ' FROM [dbo].[' + @TAULA + '] AS a '
SET @SEL = @SEL + ' WHERE a.id_gestio = ' + CAST(@id_gestio AS VARCHAR)
SET @SEL = @SEL + ' AND a.id_mnu = ' + CAST(@id_mnu AS VARCHAR)
EXECUTE (@SEL)
RETURN
END
ELSE
GOTO ACCES_A_RES
ACCES_A_RES:
SET @permisos 'p_id_gestio,p_id_mnu,apareix_a_fitxa,apareix_a_mnu,win_frm_accio,web_frm_ac
cio'
RETURN
GO
SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GO
 

Leer las respuestas

#1 Maximiliano Damian Accotto
03/01/2004 - 14:51 | Informe spam
Adam, creo entender que estas intentado hacer los acceso a una aplicacion de
esta forma no?

De ser asi no lo haria como lo estas haciendo, yo trato siempre en mis
aplicaciones que los usuarios no tengan Acceso directo a las tablas, para
ello o uso Funciones de Aplicacion (te lo recomiendo por lo facil,seguro y
potente que son) o Procedimietos almacenados los cuales acceden a las tablas
y solo los usuarios tienen acceso a estos.

Va son formas de trabajar,no digo que la tuya no sea buena ni mucho menos
pero me preocupa que un Usuario al tener acceso directo a mis tablas se
conecte con un Excel por ej y pueda traer un listado de clientes, cosa que
quiero evitar, o lo que es peor que me metan datos por fuera de mi
aplicacion

No respondi tu pregunta, solo te doy un consejo de como lo hago y lo hice
desde casi siempre.

Salu2

Maximiliano Damian Accotto
Gerente de IT
Fundicion San Cayetano S.A.
Buenos Aires Argentina
-
maxi_accotto[arroba]speedy[.]com[.].ar
MSN:



"Adam Viussà" escribió en el mensaje
news:
Os presento esta procedure que, en función de los permisos de un usuario,


se
modificaran los campos en los que el usuario tenga permiso y, se devolverá
un String con los nombres de campo que el usuario no tenga permiso...

Al principio creo que està bién pero no me convence el final de ir
comentando campo por campo de la tabla.
Por esto quería interntarlo hacer con la Stored Procedure de sistema
"SP_SPKEYS" que retorna los campos
que son PK y, de esta forma hacer un cursor solo con las Columnas que no


son
PK para poder comprobar
si el usuario pueder hacer UPDATE o no...

haber como lo veis...

Gracias.
/*
Esta tabla indica los bits utilizados para los permisos de
objetos quese devuelven cuando sólo se especifica objectid.
Bit(dec) Bit(hex) Permiso de la instrucción
1 0x1 SELECT ALL
2 0x2 UPDATE ALL
4 0x4 REFERENCES ALL
8 0x8 INSERT
16 0x10 DELETE
32 0x20 EXECUTE (sólo procedimientos)
4096 0x1000 SELECT ANY (al menos una columna)
8192 0x2000 UPDATE ANY
16384 0x4000 REFERENCES ANY
Esta tabla muestra los bits utilizados para los permisos de
objeto en lo referente a columnas, devueltos cuando se
especifican objectid y también column.
Bit(dec) Bit(hex) Permiso de la instrucción
1 0x1 SELECT
2 0x2 UPDATE
4 0x4 REFERENCES
*/
CREATE PROCEDURE [dbo].[MNU_OPCIONS_M]
@permisos VARCHAR(512) OUTPUT,
@id_gestio INT,
@id_mnu INT,
@p_id_gestio INT,
@p_id_mnu INT,
@apareix_a_fitxa INT,
@apareix_a_mnu INT,
@win_frm_accio VARCHAR(256),
@web_frm_accio VARCHAR(256)
AS
DECLARE @TAULA VARCHAR(512)
DECLARE @SEL VARCHAR(500)
SET @TAULA = 'MNU_OPCIONS'
IF PERMISSIONS(OBJECT_ID(@TAULA)) & 0x2 = 0x2
BEGIN
UPDATE a
SET a.p_id_gestio = @p_id_gestio,
a.p_id_mnu = @p_id_mnu,
a.apareix_a_fitxa = @apareix_a_fitxa,
a.apareix_a_mnu = @apareix_a_mnu,
a.win_frm_accio = @win_frm_accio,
a.web_frm_accio = @web_frm_accio
FROM [dbo].[MNU_OPCIONS] AS a
WHERE a.id_gestio = @id_gestio
AND a.id_mnu = @id_mnu
SET @permisos = ''
RETURN
END
ELSE
IF PERMISSIONS(OBJECT_ID(@TAULA)) & 0x2000 = 0x2000
BEGIN
SET @SEL = 'UPDATE a SET '
SET @permisos = ''
IF PERMISSIONS(OBJECT_ID(@TAULA),'p_id_gestio') & 0x2 = 0x2
SET @SEL = @SEL + 'a.p_id_gestio = ' + CAST(@p_id_gestio AS VARCHAR)


+
', '
ELSE
SET @permisos = @permisos + 'p_id_gestio,'
IF PERMISSIONS(OBJECT_ID(@TAULA),'p_id_mnu') & 0x2 = 0x2
SET @SEL = @SEL + 'a.p_id_mnu = ' + CAST(@p_id_mnu AS VARCHAR) + ',


'
ELSE
SET @permisos = @permisos + 'p_id_mnu,'
IF PERMISSIONS(OBJECT_ID(@TAULA),'apareix_a_fitxa') & 0x2 = 0x2
SET @SEL = @SEL + 'a.apareix_a_fitxa = ' + CAST(@apareix_a_fitxa AS
VARCHAR)+ ', '
ELSE
SET @permisos = @permisos + 'apareix_a_fitxa,'
IF PERMISSIONS(OBJECT_ID(@TAULA),'apareix_a_mnu') & 0x2 = 0x2
SET @SEL = @SEL + 'a.apareix_a_mnu = ' + CAST(@apareix_a_mnu AS
VARCHAR)+ ', '
ELSE
SET @permisos = @permisos + 'apareix_a_mnu,'
IF PERMISSIONS(OBJECT_ID(@TAULA),'win_frm_accio') & 0x2 = 0x2
SET @SEL = @SEL + 'a.win_frm_accio = ''' + @win_frm_accio + ''', '
ELSE
SET @permisos = @permisos + 'win_frm_accio,'
IF PERMISSIONS(OBJECT_ID(@TAULA),'web_frm_accio') & 0x2 = 0x2
SET @SEL = @SEL + 'a.web_frm_accio = ''' + @web_frm_accio + ''', '
ELSE
SET @permisos = @permisos + 'web_frm_accio,'
IF @SEL = 'UPDATE a SET '
GOTO ACCES_A_RES
SET @SEL = LEFT(@SEL,LEN(@SEL)-1)
SET @permisos = LEFT(@permisos,LEN(@permisos)-1)
SET @SEL = @SEL + ' FROM [dbo].[' + @TAULA + '] AS a '
SET @SEL = @SEL + ' WHERE a.id_gestio = ' + CAST(@id_gestio AS


VARCHAR)
SET @SEL = @SEL + ' AND a.id_mnu = ' + CAST(@id_mnu AS VARCHAR)
EXECUTE (@SEL)
RETURN
END
ELSE
GOTO ACCES_A_RES
ACCES_A_RES:
SET @permisos >


'p_id_gestio,p_id_mnu,apareix_a_fitxa,apareix_a_mnu,win_frm_accio,web_frm_ac
cio'
RETURN
GO
SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GO


Preguntas similares