AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke Delphi Login-Funktion: nur ein Benutzer mit bestimmten Zugangsdaten
Thema durchsuchen
Ansicht
Themen-Optionen

Login-Funktion: nur ein Benutzer mit bestimmten Zugangsdaten

Ein Thema von romber · begonnen am 20. Aug 2005 · letzter Beitrag vom 9. Jul 2006
Antwort Antwort
Seite 4 von 4   « Erste     234   
jensw_2000
(Gast)

n/a Beiträge
 
#31

Re: Login-Funktion: nur ein Benutzer mit bestimmten Zugangsd

  Alt 9. Jul 2006, 23:08
Inhalt einer PN:
Zitat von Romber:
Hallo jensw_2000!

ich bin mir nicht sicher, dass Sie sich noch daran errinern, aber vor einiger Zeit haben Sie mir bei der Lösung meines Problems sehr kompetent geholfen. Das war diesen Beitrag Login-Funktion: nur ein Benutzer mit bestimmten Zugangsdaten. Dort mit dem Beitrag #26 haben Sie mir die Lösung gepostet. Diese Lösung ist absoloute spitze, die verwende ich immer noch und es funktioniert super. Noch mal vielen Dank!

Ich stehe jetzt vor einer Aufgabe, die ich ohne Ihrer Hilfe ganz sicher nicht lösen kann. Und zwar geht es immer noch um diese SQL-Code, die Sie mir damals gepostet haben. Diese Code bzw. diese SP gewährleistet, dass nur ein Benutzer mit den bestimmten Zugangsdaten zur selber Zeit sich einloggen kann.

Mein Problem ist: ich muss die SQL-Code jetzt so umschreiben, dass sich max. 3 Benutzer mit den gleichen Zugangsdaten zur gleicher Zeit anmelden können. Leider habe ich von SQL nicht viel Ahnung und werde Ihnen sehr dankbar, wenn Sie mir dabei helfen würden.

P.S. Falls es viel Zeit braucht, würde ich natürlich gerne für Ihre Zeit bezahlen.

Im Voraus vielen Dank!
Für den Fall das jemand mal etwas Ähnliches benötigt, hänge ich den geänderten Code hier noch einmal komplett an.
Erklärungen zur Verwendung gibt es im Post #26.

Zitat von romber:
P.S. Falls es viel Zeit braucht, würde ich natürlich gerne für Ihre Zeit bezahlen.
Ich hoffe das du mir auch mal hilfst, ohne gleich eine Rechnung zu schreiben .

DDL der Tabelle "SYS_ActiveUsers"
SQL-Code:
CREATE TABLE [SYS_ActiveUsers] (
  [USERNAME] varchar(50) NOT NULL,
  [Workstation] varchar(12) NOT NULL,
  [LAST_SEEN] datetime DEFAULT (getdate()) NOT NULL,
  [LOCK_TIME_SECS] int DEFAULT (600) NOT NULL
)
ON [PRIMARY]
GO
DDL der Stored Procedure "SYS_Check_User_LoginCount"
SQL-Code:
CREATE PROCEDURE SYS_Check_User_LoginCount
(
@USERNAME VARCHAR(50) = NULL,
@WORKSTATION VARCHAR(12) = NULL,
@LOGOUT BIT = NULL,
@AllowLogin BIT = 0 OUTPUT
)
AS
BEGIN

-- Variablen deklarieren

DECLARE @TEMPTIME DATETIME
DECLARE @TEMPDIFF INTEGER
DECLARE @MAXLOGINS INTEGER
DECLARE @CURRENTLOGINS INTEGER

-- Standardwerte setzen

SET @MAXLOGINS = 2 -- Ein Username kann sich von 2 unterschiedlichen Workstations anmenden
SET @CURRENTLOGINS = 0 -- @CURRENTLOGINS initialisieren

-- Parameter überprüfen

IF @USERNAME IS NULL OR @WORKSTATION IS NULL
BEGIN
  SET @AllowLogin = 0
  RAISERROR('Benutzername und Arbeitsstationsname müssen übermittelt werden',16,1,'SQL-Login')
END

-- Logout ??

IF @LOGOUT IS NULL SET @LOGOUT =0

IF @LOGOUT = 1
BEGIN
  -- Benutzer meldet sich regulär ab
  DELETE FROM SYS_ActiveUsers
        WHERE USERNAME=@USERNAME
          AND WORKSTATION=@WORKSTATION
  SET @AllowLogin=0
END
ELSE BEGIN


  IF EXISTS (
             SELECT USERNAME
             FROM SYS_ActiveUsers
             WHERE USERNAME=@USERNAME AND WORKSTATION = @WORKSTATION
            )
  BEGIN
    -- Relogin (selber User von der selben Workstation)
    -- Last_Seen Updaten und AllowLogin setzen
    UPDATE SYS_ActiveUsers SET LAST_SEEN = GETDATE()
    WHERE USERNAME=@USERNAME
          AND WORKSTATION=@WORKSTATION
    SET @AllowLogin=1
  END
  ELSE BEGIN
     -- Login des selben Users von einer anderen Workstation --

     -- Inaktive User (mit anderen Workstations) bereinigen,
     -- dann die Anzahl der Logins pro Username zählen.

     -- Prüfen, ob ein die Anzahl @MAXLOGINS für diesen User erreicht wurde.
     -- Wenn Anzahl der Logins <= @MAXLOGINS dann Login erlauben und Last_Seen setzen,
     -- sonst Login verweigern.

      -- inaktive User löschen
      DELETE
      FROM SYS_ActiveUsers
      WHERE USERNAME=@USERNAME
            AND WORKSTATION <> @WORKSTATION
            AND ABS( DATEDIFF( SECOND,LAST_SEEN,GETDATE() ) ) > LOCK_TIME_SECS

      -- Zählen, wie oft @USERNAME angemeldet ist ...
      SELECT @CURRENTLOGINS = Count(*)
      FROM SYS_ActiveUsers
      WHERE USERNAME=@USERNAME
      -- Wenn die Anzahl der Logins <= @MAXLOGINS dann User anmelden
      IF @CURRENTLOGINS < @MAXLOGINS
      BEGIN
        INSERT INTO SYS_ActiveUsers (USERNAME
                                    ,WORKSTATION
                                    ,LAST_SEEN
                                    ,LOCK_TIME_SECS)
                        VALUES (@USERNAME
                                    ,@WORKSTATION
                                    ,GETDATE()
                                    ,600) -- Timeout Sekunden (Verfallszeit)
        SET @AllowLogin=1
      END
      ELSE BEGIN
        -- sonst Login verweigern
        SET @AllowLogin=0
      END
  END

END

END
GO

Delphi - Funktion um den User anzumelden, um das Login zu "Refreshen" und um den User anzumelden
Delphi-Quellcode:
var Authentificated : boolean;
...
...
function CheckLogin(Logout:Boolean): Boolean;
  var SP:TAdoStoredProc;
begin
{
SQL - Syntax Hinweis
--------------------------------------------
CREATE PROCEDURE SYS_Check_User_LoginCount
(
@USERNAME VARCHAR(50) = NULL,
@WORKSTATION VARCHAR(12) = NULL,
@LOGOUT BIT = NULL,
@AllowLogin BIT = 0 OUTPUT
)
}
 

  SP:=TAdoStoredProc.create(nil);
  SP.Connection:=MeineAdoConn; // Hier deine AdoConn
  try
    SP.Procedurename:='SYS_Check_User_LoginCount';
    SP.Parameters.refresh;
    SP.Parameters[1].Value:=MeinUserName;
    SP.Parameters[2].Value:=MeinPcName;
    if Logout then SP.Parameters[3].Value:=1
      else SP.Parameters[3].Value:=0;
    SP.ExecProc;
    Result:=SP.Parameters[4].Value;
  finally
    FreeAndNil(SP);
  end;

  if Authentificated AND (NOT Logout) AND (NOT Result) then
  begin
    Showmessage('Ihr login wird gelöscht, weil von Ihrer Arbeitsstation keine "KeepAlive-Aufrufe"'+#13#10+
                'an die SP "SYS_Check_User_LoginCount" gesendet wurden, bzw. deren Timing nicht passt ...');
  end;

  if (NOT Authentificated) AND (NOT Result) then
  begin
    Showmessage('Die Anzahl der erlaubten Anmeldungen für "'+MeinUsername+'" ist überschritten.'+#13#10+
                'Bitte verwenden Sie einen anderen Benutzernamen oder versuchen Sie es später noch einmal.');
  end;

  Authentificated:=(NOT Logout) AND RESULT;

end;


Schöne Grüße,
Jens
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 4 von 4   « Erste     234   


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:02 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz