![]() |
Re: Login-Funktion: nur ein Benutzer mit bestimmten Zugangsd
Inhalt einer PN:
Zitat:
Erklärungen zur Verwendung gibt es im ![]() Zitat:
DDL der Tabelle "SYS_ActiveUsers"
SQL-Code:
DDL der Stored Procedure "SYS_Check_User_LoginCount"
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
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 :hi: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:34 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz