none
Funcion para Inicio de sesion que valide el perfil del usuario (maestro o alumno) RRS feed

  • Pregunta

  • Buen dia amigos,
    Necesito de su ayuda con una función para el inicio de sesión, la función tiene lo siguiente:
    • Parámetro de entrada, usuario y clave.
    • Debe validar que el usuario y la clave existan y coinciden, si el usuario y contraseña no coinciden o no existe, los parámetros de salida son -1.
    • Si el usuario y la clave coinciden, deben verificar si la persona es un alumno o un maestro, si es maestro, retornar 0, en caso contrario es 1.

    Con esta funcion se valida el inicio de sesion, pero no tengo idea como validar si es un alumno o un maestro.
    ALTER FUNCTION [dbo].[INICIO_SESION] 
    (
    	@cod_usuario varchar(20),
    	@clave varchar(20)
    )
    RETURNS VARCHAR(20)
    AS
    BEGIN
    	Declare @cta int
    	Declare @clv varchar(20)
    	
    	Select @cta = count(*)
    	from Usuarios
    	where cod_usuario = @cod_usuario
    
    	if @cta <= 0
    		return '-1'
    
    	Select @clv = Convert(varchar(20),DECRYPTBYPASSPHRASE(clave,@cod_usuario))
    	from tbUsuarios
    	where cod_usuario = @cod_usuario
    
    	if @clv = @clave
    		return 0
    
    	return @clv
    END
    Este es el script de persona y profesor
    CREATE TABLE [dbo].[persona](
    	[id] [int] IDENTITY(1,1) NOT NULL,
    	[nif] [varchar](9) NULL,
    	[nombre] [varchar](25) NOT NULL,
    	[apellido1] [varchar](50) NOT NULL,
    	[apellido2] [varchar](50) NULL,
    	[ciudad] [varchar](25) NOT NULL,
    	[direccion] [varchar](50) NOT NULL,
    	[telefono] [varchar](9) NULL,
    	[fecha_nacimiento] [date] NOT NULL,
    	[sexo] [varchar](2) NOT NULL,
    	[enum] [varchar](10) NOT NULL,
    PRIMARY KEY CLUSTERED 
    (
    	[id] ASC
    )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
    ) ON [PRIMARY]
    GO
    /****** Object:  Table [dbo].[profesor]    Script Date: 28/2/2019 16:47:13 ******/
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    CREATE TABLE [dbo].[profesor](
    	[id_profesor] [int] NOT NULL,
    	[id_departamento] [int] NOT NULL,
    PRIMARY KEY CLUSTERED 
    (
    	[id_profesor] ASC
    )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
    ) ON [PRIMARY]

    La tabla Usuarios tiene usuario, clave y Id_Persona. El campo Id_Persona esta enlazado con id de la tabla persona.

    Tal vez puedan ayudarme, mi conocimiento en SQL Server es muy bajo ya que acabo de comenzar con esto.

    Saludos.


    lunes, 2 de septiembre de 2019 2:17

Respuestas

  • Hola TheRealJoker7:

    INSERT INTO dbo.persona(nif,nombre,apellido1,apellido2, ciudad, direccion,	telefono,	fecha_nacimiento,	sexo,	enum)
    values
    ('010101','ANA','PEREZ','MAR','VILLAVICIOSA','S/N','123','19740804','F','...'),
    ('010102','BEA','PEREZ','SOL','VILLAVICIOSA','S/N','456','19810804','F','...');
    
    INSERT INTO Profesor (id_profesor, id_departamento)
    VALUES
    (2,1)
    
    
    /* la tabla de usuarios */
    
    CREATE TABLE USUARIOS
    (COD_USUARIO VARCHAR(20) PRIMARY KEY, 
     CLAVE   VARBINARY(8000), 
     ID_PERSONA  INT NOT NULL
    );
    GO
    INSERT INTO USUARIOS (COD_USUARIO, CLAVE, ID_PERSONA) 
    VALUES 
    ('ANA'   ,ENCRYPTBYPASSPHRASE('CLAVESEGURA','AnaPwd'),1),
    ('BEA',ENCRYPTBYPASSPHRASE('CLAVESEGURA','BEAPwd'), 2);

    Hay 2 usuarios. Bea es profesor.

    ALTER FUNCTION [dbo].[INICIO_SESION] 
    (
    	@cod_usuario varchar(20),
    	@clave varchar(20)
    )
    RETURNS SMALLINT 
    /* PORQUE RETORNAR UN VARCHAR SI EL VALOR QUE SE DEVUELVE SIEMPRE ES UN NUMERO */
    AS
    BEGIN
    	Declare @clv varchar(20);
    	Declare @idPersona int;
    	SELECT @clv = TRY_CAST(DECRYPTBYPASSPHRASE('CLAVESEGURA', CLAVE) AS VARCHAR(20)), @idPersona=ID_PERSONA
            FROM Usuarios
            WHERE EXISTS
            (
                SELECT *
                FROM usuarios
                WHERE COD_USUARIO = @cod_usuario
            ) and @cod_usuario = COD_USUARIO
    
         IF (@clv IS NULL) /* NO HA ENCONTRADO USAURIO CON CLAVE */
    	   RETURN -1;
    	   
    	IF @clv = @clave
         BEGIN	   
    	   if (exists (select * from profesor where id_profesor = @idPersona))
    		  RETURN 0; /* ES MAESTRO; */
    	   ELSE
    		  RETURN 1; /* ES USUARIO */
    	   END
    RETURN -1; /* NUNCA DEBE DE LLEGAR AQUÍ. */
    END

    La ejecución:

    SELECT 
         [dbo].[INICIO_SESION] ('ANA','AnaPwd') AS NormalOk,
    	[dbo].[INICIO_SESION]('BEA','BEAPwd') AS ProfeOk,
    	[dbo].[INICIO_SESION]('JONAS','CCLAVE') As NoExiste,
    	[dbo].[INICIO_SESION] ('ANA','AnaNoOk') AS NormalNoOk,
    	[dbo].[INICIO_SESION]('BEA','BEANoOk') AS ProfeNoOk

    Salida


    • Marcado como respuesta TheRealJoker7 lunes, 2 de septiembre de 2019 21:39
    lunes, 2 de septiembre de 2019 5:33

Todas las respuestas

  • Hola TheRealJoker7:

    INSERT INTO dbo.persona(nif,nombre,apellido1,apellido2, ciudad, direccion,	telefono,	fecha_nacimiento,	sexo,	enum)
    values
    ('010101','ANA','PEREZ','MAR','VILLAVICIOSA','S/N','123','19740804','F','...'),
    ('010102','BEA','PEREZ','SOL','VILLAVICIOSA','S/N','456','19810804','F','...');
    
    INSERT INTO Profesor (id_profesor, id_departamento)
    VALUES
    (2,1)
    
    
    /* la tabla de usuarios */
    
    CREATE TABLE USUARIOS
    (COD_USUARIO VARCHAR(20) PRIMARY KEY, 
     CLAVE   VARBINARY(8000), 
     ID_PERSONA  INT NOT NULL
    );
    GO
    INSERT INTO USUARIOS (COD_USUARIO, CLAVE, ID_PERSONA) 
    VALUES 
    ('ANA'   ,ENCRYPTBYPASSPHRASE('CLAVESEGURA','AnaPwd'),1),
    ('BEA',ENCRYPTBYPASSPHRASE('CLAVESEGURA','BEAPwd'), 2);

    Hay 2 usuarios. Bea es profesor.

    ALTER FUNCTION [dbo].[INICIO_SESION] 
    (
    	@cod_usuario varchar(20),
    	@clave varchar(20)
    )
    RETURNS SMALLINT 
    /* PORQUE RETORNAR UN VARCHAR SI EL VALOR QUE SE DEVUELVE SIEMPRE ES UN NUMERO */
    AS
    BEGIN
    	Declare @clv varchar(20);
    	Declare @idPersona int;
    	SELECT @clv = TRY_CAST(DECRYPTBYPASSPHRASE('CLAVESEGURA', CLAVE) AS VARCHAR(20)), @idPersona=ID_PERSONA
            FROM Usuarios
            WHERE EXISTS
            (
                SELECT *
                FROM usuarios
                WHERE COD_USUARIO = @cod_usuario
            ) and @cod_usuario = COD_USUARIO
    
         IF (@clv IS NULL) /* NO HA ENCONTRADO USAURIO CON CLAVE */
    	   RETURN -1;
    	   
    	IF @clv = @clave
         BEGIN	   
    	   if (exists (select * from profesor where id_profesor = @idPersona))
    		  RETURN 0; /* ES MAESTRO; */
    	   ELSE
    		  RETURN 1; /* ES USUARIO */
    	   END
    RETURN -1; /* NUNCA DEBE DE LLEGAR AQUÍ. */
    END

    La ejecución:

    SELECT 
         [dbo].[INICIO_SESION] ('ANA','AnaPwd') AS NormalOk,
    	[dbo].[INICIO_SESION]('BEA','BEAPwd') AS ProfeOk,
    	[dbo].[INICIO_SESION]('JONAS','CCLAVE') As NoExiste,
    	[dbo].[INICIO_SESION] ('ANA','AnaNoOk') AS NormalNoOk,
    	[dbo].[INICIO_SESION]('BEA','BEANoOk') AS ProfeNoOk

    Salida


    • Marcado como respuesta TheRealJoker7 lunes, 2 de septiembre de 2019 21:39
    lunes, 2 de septiembre de 2019 5:33
  • Hola,
    Ya lo probe en la base de datos y funciona perfecto. Muchas gracias.

    Pero tengo una consulta, que significa:

    'CLAVESEGURA'

    Yo tengo este procedimiento para agregar usuarios:

    CREATE PROCEDURE Nuevo_Usuario 
    	@cod_usuario varchar(20),
    	@clave varchar(20),
    	@cod_emp varchar(10),
    	@rst int output
    AS
    BEGIN
    	Declare @cta int
    	Select @cta = count (*)
    	from tbUsuarios
    	where cod_usuario = @cod_usuario
    
    	if @cta > 0
    	Begin
    		set @rst = -1
    		return
    	End
    
    	Insert Into tbUsuarios
    	values (@cod_usuario, ENCRYPTBYPASSPHRASE(@clave,@cod_usuario),@cod_emp)
    
    	set @rst = 0
    END

    Y me los agrega bien a la base, pero al probar la funcion para iniciar sesion no me reconoce los usuarios.
    En el procedimiento la parte del ingreso del usuario se la cambie y quedo asi:

    Insert Into USUARIOS
    	values (@COD_USUARIO, ENCRYPTBYPASSPHRASE('CLAVESEGURA',@CLAVE),@ID_PERSONA)

    Ahora si me reconoce los usuarios ingresados desde el procedimiento que cree para ello.

    Me gustaria despejar esa duda. No se que tanto afecta o que diferencia existe entre esas formas de ingresar los datos

    Saludos.



    lunes, 2 de septiembre de 2019 21:39
  • Hola TheRealJoker7:

    Es mi semilla de encriptación. Mira este artículo y creo que te ayudará.

    ENCRYPTBYPASSPHRASE y DECRYPTBYPASSPHRASE

    https://javifer2.blogspot.com/search/label/encryptbypassphrase

    martes, 3 de septiembre de 2019 9:17