Einzelnen Beitrag anzeigen

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