Tema: Seguridad
Ver Mensaje Individual
  #2  
Antiguo 29-07-2010
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Reputación: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola shoulder.

Se me ocurre que podrías usar una solución basada en eventos.
Hice un ejemplo el cuál deberías modificar para que los datos se tomen de la tabla de usuarios en la creación.
Además en la renovación del tiempo, evaluar que el usuario realize alguna acción. (yo lo hice pulsando un botón como prueba)

Algo como:
Código:
interface
  ...
 
type
  TUsuario = class;
  TEventoFinSesion = procedure (User: TUsuario) of object;
  TUsuario = class
  private
    FNombre: string;
    FPasswd: string;
    FTiempoInactivo: TTime;
    FTimer: TTimer;
    procedure TiempoAgotado(Sender: TObject);
  public
    EventoFinSesion : TEventoFinSesion;
    constructor Create(ANombre,APasswd: string);
    destructor Destroy; override;
    property Nombre: string read FNombre write FNombre;
    property Passwd: string read FPasswd write FPasswd;
    procedure RenewTime;
  end;

 TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
  public
    procedure InitTimeUsr(Sender: TObject);
    procedure UsuarioFuera(Usr: TUsuario);
  end;

var
  Form1: TForm1;
  Usuario: TUsuario;
 
implementation

{ TUsuario Create }
constructor TUsuario.Create(ANombre, APasswd: string);
begin
  FNombre:= ANombre;
  FPasswd:= APasswd;
  FTiempoInactivo:= Time;
  FTimer:= TTimer.Create(nil);
  with FTimer do
  begin
    Enabled:=  False;
    Interval:= 1000*60*90;   // 90 minutos
    OnTimer:=  TiempoAgotado;
    Enabled:=  True;
  end;
end;

{ TUsuario Destroy }
destructor TUsuario.Destroy;
begin
  FTimer.Free;
  inherited Destroy;
end;

{ TUsuario Renovar tiempo }
procedure TUsuario.RenewTime;
begin
  FTiempoInactivo:= Time;
  with FTimer do
  begin
    Enabled:= False;
    Interval:= 1000*60*90; // otros 90 minutos
    Enabled:= True;
  end;
end;

{ TUsuario Tiempo agotado }
procedure TUsuario.TiempoAgotado(Sender: TObject);
begin
  FTimer.Enabled:= False;
  if Assigned(EventoFinSesion) then
    EventoFinSesion(Self);
end;
LLamadas:
Código:
{ Inicia sesion }
procedure TForm1.InitTimeUsr(Sender: TObject);
begin
  Usuario:= TUsuario.Create('JUAN', '123');
  Usuario.EventoFinSesion:= UsuarioFuera;
end;
 
{ Prueba, ingreso del usuario }
procedure TForm1.Button1Click(Sender: TObject);
begin
   InitTimeUsr(Self);
end;
 
{ Tiempo inactivo cumplido }
procedure TForm1.UsuarioFuera(Usr: TUsuario);
begin
   ShowMessage('El usuario '+Usr.Nombre+
  'inactivo durante 90 min. Sesión terminada');
  Usr.Free;
end;
 
{ Realizó alguna operacion, se le conceden 90 min + }
procedure TForm1.Button2Click(Sender: TObject);
begin
  Usuario.RenewTime;
end;
Espero que la idea te sirva.

Saludos.
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....

Última edición por ecfisa fecha: 29-07-2010 a las 22:25:41.
Responder Con Cita