Ir al contenido


Foto

Cantidad usuarios conectados al DataSnap Server


  • Por favor identifícate para responder
12 respuestas en este tema

#1 marcelogracia

marcelogracia

    Member

  • Miembros
  • PipPip
  • 38 mensajes

Escrito 12 enero 2013 - 04:46

Amigos, estoy trabajando con datasnap, y en el servidor quisiera poder contar la cantidad de usuarios que se van desconectando y los q van conectandose...
No consigo como hacerlo...
También saber que se tiene q tener en cuenta a la hora de seguridad del servidor datasnap??...

Alguna ayuda me viene muy bien.. toy medio perdido.......
Slds.
  • 0

#2 Wilson

Wilson

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.137 mensajes

Escrito 12 enero 2013 - 08:50

En que versión de Delphi estás trabajando?
  • 0

#3 marcelogracia

marcelogracia

    Member

  • Miembros
  • PipPip
  • 38 mensajes

Escrito 13 enero 2013 - 11:25

Disculpas WIlson, estoy trabajando con DXE2 ---

  • 0

#4 Wilson

Wilson

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.137 mensajes

Escrito 13 enero 2013 - 07:41

En este artículo está muy claro como controlar las conexiones.

Como una medida de seguridad podrías  utilizar el evento OnUserAuthenticate del componente TDSAuthenticationManager, consta de varios parámetros, entre ellos el user y el password de quien intenta conectarse, también dispone de un parámetro que es una variable de tipo booleano, a la cual podrías pasarle una función booleana que compruebe la autenticidad del usuario, por ejemplo:



delphi
  1. function UsuarioValido(User,Password :string):boolean;
  2. var
  3.   q: TSQLQuery;
  4. begin
  5.   q := TSQLQuery.Create(nil);
  6.   q.sqlConnection := TuConexion;
  7.   q.SQL.Clear;
  8.   q.SQL.Add(
  9.     'SELECT USER, PASSWORD FROM USUARIOS WHERE USER = '+
  10.     QuotedStr(User)+' AND PASSWORD = '+ QuotedStr(Password));
  11.   q.Open;
  12.   Result := not q.IsEmpty;
  13.   q.Close;
  14.   q.Free;
  15. end;
  16.  
  17. procedure TServerContainer1.DSAuthenticationManager1UserAuthenticate(
  18.   Sender: TObject; const Protocol, Context, User, Password: string;
  19.   var valid: Boolean; UserRoles: TStrings);
  20. begin
  21.   valid := UsuarioValido(User, Password);
  22. end;



El anterior es un ejemplo demasiado básico, pero te sirve para tener una idea. Podrías hacer uso del resto de parámetros. Igualmente la consulta sobre la tabla de usuarios podría incluir campos como "HABILITADO", además de todo lo que consideres necesario.

También puede hacer uso del evento OnUserAuthorize del mismo componente, este se dispara después de que la autenticación  sea exitosa, en este punto puedes especificar a  que métodos podrá acceder el usuario autenticado, del mismo modo puede crear roles para grupos de usuarios, en la wiki de embarcadero encontrarás varios ejemplos.

Un cordial saludo.
  • 0

#5 asapltda

asapltda

    Newbie

  • Miembros
  • Pip
  • 9 mensajes

Escrito 29 diciembre 2013 - 10:41

Hola Estoy iniciaando en este tema de datasnap server, en que unidad se debe colocar el codigo
[code=delphi:0]
function UsuarioValido(User,Password :string):boolean;
var
  q: TSQLQuery;
.....
[code=delphi:0]/
Existe en el servidor 2 unidades la de coneccion y la unidad de definicion de tablas
Gracias
  • 0

#6 Wilson

Wilson

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.137 mensajes

Escrito 29 diciembre 2013 - 12:18

Hola Estoy iniciaando en este tema de datasnap server, en que unidad se debe colocar el codigo
[code=delphi:0]
function UsuarioValido(User,Password :string):boolean;
var
  q: TSQLQuery;
.....
[code=delphi:0]/
Existe en el servidor 2 unidades la de coneccion y la unidad de definicion de tablas
Gracias


Yo la coloco directamente en la unidad del DataModule que contiene el TDSServer y el TDSAuthenticationManager.

Saludos.
  • 0

#7 genriquez

genriquez

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 528 mensajes
  • LocationCali, Colombia

Escrito 29 diciembre 2013 - 03:57

Hay una forma eficiente de hacer esto y es la siguiente:

En el oncreate del datamodule principal (Container por defecto) se agrega la siguiente instrucción:



delphi
  1.   TDSSessionManager.Instance.AddSessionEvent(
  2.       procedure(Sender: TObject; const EventType: TDSSessionEventType; const Session: TDSSession)
  3.       begin
  4.         case EventType of
  5.             SessionCreate:
  6.               SessionInicio(Session); //Se ejecuta cuando la sesión se inicializa
  7.             SessionClose:
  8.               SessionFin(Session);  //Se ejecuta cuando la sesión se finaliza
  9.         end;
  10.       end);



Ejecutando dos métodos personalizados así



delphi
  1. procedure TFDMServerContainer.SessionInicio(Session: TDSSession);
  2. begin
  3.   // Aquí va el código de inicialización  Ej.  Inc(CanUsuarios)
  4. end;
  5.  
  6.  
  7. procedure TFDMServerContainer.SessionFin(Session: TDSSession);
  8. begin
  9.   //Aquí va el código de finalización  Ej.  Dec(CanUsuarios)
  10. End;


Sin embargo la validación de sesión es otro asunto diferente y se realiza en el AuthenticationManager, como se explica en varios tutoriales.
  • 0

#8 giulichajari

giulichajari

    Advanced Member

  • Miembros
  • PipPipPip
  • 469 mensajes

Escrito 13 julio 2015 - 05:56

Perdon por el tiempo que ha pasado, en el ejemplo que postea wilson: de que tipo es FConnections?

El identificador TDSSessionManager no me lo reconoce: que componente debo agregar?


  • 0

#9 cadetill

cadetill

    Advanced Member

  • Moderadores
  • PipPipPip
  • 994 mensajes
  • LocationEspaña

Escrito 13 julio 2015 - 07:24

Buenas

 

El ejemplo del link que menciona Wilson está hecho en DataSnap "clasico", por lo que está usando los eventos OnConnect y OnDisconnect del TDSTCPServerTransport. La variable que menciona, FConnections es un TObjectDictionnary definida tal que así


php
  1. FConnections: TObjectDictionary<TIdTCPConnection,TDSTCPChannel>;

Puedes ver un ejemplo de DataSnap "clásico" en los ejemplos de la instalación de Delphi/RAD Studio en C:\Users\Public\Documents\Embarcadero\Studio\15.0\Samples\Object Pascal\DataSnap\DataSnapMonitor\Server\MonitorConnectionsServerProject.dproj (o en la ruta que toque según SO instalado o versión de Delphi/RAD Studio).

 

En el caso de que usaras DataSnap REST, se haria de forma algo distinta. Coméntalo y te pongo un ejemplo

 

Salut!


  • 0

#10 giulichajari

giulichajari

    Advanced Member

  • Miembros
  • PipPipPip
  • 469 mensajes

Escrito 13 julio 2015 - 07:39

Si. lo que busco es mostrar la cantidad de usuarios conectados, mas que nada para que se pueda saber si funciona la aplicacion.Indudablemente seria bueno ver el nombre del usuario, por ej nombre de la sucursal del negocio conectada al server.

 

Estoy pensando hacer en el server donde esta el boton iniciar parar(para que corra el servicio) el monitoreo de conneciones y el monitoreo de transacciones(en otro form).

 

Ahora agregue Generics.Collections para poder utilizar ese tipo de variable. Y lo que quisiera saber es si al objeto de tipo Fconnections se le puede pedir user y pass, etcc (la ip desde donde esta conectado). Para no mostrar solo la cantidad de usuarios.


  • 0

#11 cadetill

cadetill

    Advanced Member

  • Moderadores
  • PipPipPip
  • 994 mensajes
  • LocationEspaña

Escrito 13 julio 2015 - 09:20

Buenas

 

Dale un vistazo al ejemplo que te menciono.

 

No obstante, la opción indicada por genriquez usando la sesión es totalmente válida dado que el TDSSession tiene los parámetros que buscas, algo como


php
  1.   Protocol := Session.GetData('CommunicationProtocol');
  2.   IpAddress := Session.GetData('RemoteIP');
  3.   AppName := Session.GetData('RemoteAppName');

Salut!


  • 0

#12 giulichajari

giulichajari

    Advanced Member

  • Miembros
  • PipPipPip
  • 469 mensajes

Escrito 13 julio 2015 - 01:03

Claro el componente TDSSESSION no lo encuentro, pero voy a ver que hago y posteo la solucion...


  • 0

#13 giulichajari

giulichajari

    Advanced Member

  • Miembros
  • PipPipPip
  • 469 mensajes

Escrito 18 julio 2015 - 09:14

Bueno en mi aplicacion cliente tengo obviamente el ClientModule donde tomo los datos de un archivo .ini:


delphi
  1. with ClientModule1.SQLConnection1 do
  2. begin
  3. Close;
  4. Params.Values['DriverName']:=admin.ReadString('admin','DriverName','');
  5. Params.Values['HostName']:=admin.ReadString('admin','HostName','');
  6. Params.Values['Port']:=admin.ReadString('admin','Port','211');
  7. Params.Values['DSAuthUser']:=admin.ReadString('admin','User','');
  8. Params.Values['DSAuthPassword']:=admin.ReadString('admin','Pass','');
  9.  
  10. end;

como veran DSAuthUser y DSAuthPassword son los datos enviados al server que recibira en la autenticacion. Aunque lo ideal seria usar la tabla mysql.user (propia del motor) he creado una tabla de usuarios.

 

Lo que me falta es llenar la grilla de usuarios con los que se van conectando. Pense y coloque un clientdataset para postearle los datos como ip nombre hora etc... pero no pude obtener los datos.

Tengo el siguiente evento..


delphi
  1. procedure TServerContainer1.DSAuthenticationManager1UserAuthenticate(
  2. Sender: TObject; const Protocol, Context, User, Password: string;
  3. var valid: Boolean; UserRoles: TStrings);
  4. begin
  5.  
  6. valid := UsuarioValido(User, Password);
  7.  
  8. if valid then
  9. begin
  10. with server.cdslistado do
  11. begin
  12. Open;
  13. Edit;
  14. FieldByName('usuario').AsString:=User;
  15. Post;
  16. end;
  17. end;
  18. end;

Gracias por su ayuda


  • 0