Cantidad usuarios conectados al DataSnap Server
#1
Escrito 12 enero 2013 - 04:46
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.
#2
Escrito 12 enero 2013 - 08:50
#3
Escrito 13 enero 2013 - 11:25
#4
Escrito 13 enero 2013 - 07:41
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:
function UsuarioValido(User,Password :string):boolean; var q: TSQLQuery; begin q := TSQLQuery.Create(nil); q.sqlConnection := TuConexion; q.SQL.Clear; q.SQL.Add( 'SELECT USER, PASSWORD FROM USUARIOS WHERE USER = '+ QuotedStr(User)+' AND PASSWORD = '+ QuotedStr(Password)); q.Open; Result := not q.IsEmpty; q.Close; q.Free; end; procedure TServerContainer1.DSAuthenticationManager1UserAuthenticate( Sender: TObject; const Protocol, Context, User, Password: string; var valid: Boolean; UserRoles: TStrings); begin valid := UsuarioValido(User, Password); 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.
#5
Escrito 29 diciembre 2013 - 10:41
[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
#6
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.
#7
Escrito 29 diciembre 2013 - 03:57
En el oncreate del datamodule principal (Container por defecto) se agrega la siguiente instrucción:
TDSSessionManager.Instance.AddSessionEvent( procedure(Sender: TObject; const EventType: TDSSessionEventType; const Session: TDSSession) begin case EventType of SessionCreate: SessionInicio(Session); //Se ejecuta cuando la sesión se inicializa SessionClose: SessionFin(Session); //Se ejecuta cuando la sesión se finaliza end; end);
Ejecutando dos métodos personalizados así
procedure TFDMServerContainer.SessionInicio(Session: TDSSession); begin // Aquí va el código de inicialización Ej. Inc(CanUsuarios) end; procedure TFDMServerContainer.SessionFin(Session: TDSSession); begin //Aquí va el código de finalización Ej. Dec(CanUsuarios) 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.
#8
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?
#9
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í
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!
#10
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.
#11
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
Protocol := Session.GetData('CommunicationProtocol'); IpAddress := Session.GetData('RemoteIP'); AppName := Session.GetData('RemoteAppName');
Salut!
#12
Escrito 13 julio 2015 - 01:03
Claro el componente TDSSESSION no lo encuentro, pero voy a ver que hago y posteo la solucion...
#13
Escrito 18 julio 2015 - 09:14
Bueno en mi aplicacion cliente tengo obviamente el ClientModule donde tomo los datos de un archivo .ini:
with ClientModule1.SQLConnection1 do begin Close; Params.Values['DriverName']:=admin.ReadString('admin','DriverName',''); Params.Values['HostName']:=admin.ReadString('admin','HostName',''); Params.Values['Port']:=admin.ReadString('admin','Port','211'); Params.Values['DSAuthUser']:=admin.ReadString('admin','User',''); Params.Values['DSAuthPassword']:=admin.ReadString('admin','Pass',''); 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..
procedure TServerContainer1.DSAuthenticationManager1UserAuthenticate( Sender: TObject; const Protocol, Context, User, Password: string; var valid: Boolean; UserRoles: TStrings); begin valid := UsuarioValido(User, Password); if valid then begin with server.cdslistado do begin Open; Edit; FieldByName('usuario').AsString:=User; Post; end; end; end;
Gracias por su ayuda