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 10. Jul 2006
Antwort Antwort
Seite 3 von 4     123 4      
neolithos

Registriert seit: 31. Jul 2003
Ort: Dresden
1.386 Beiträge
 
Delphi 7 Architect
 
#21

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

  Alt 22. Aug 2005, 17:23
Zitat von Jelly:
Hat überhaupt einer meinen Beitrag über die sysprocesses Tabelle beim MSSQL Server gelesen. Da läuft diese ganze "Ich bin da" Sache doch komplett im Hintergrund ab. Warum das Rad neu erfinden?
Ich schon, und ich habe sowas mit einem ASA-Server (ist ähnlich dem MSSQL) schon gemacht, es lief auf einen einzigen SQL-Befehl raus. Kann man also nur empfehlen.
- ciao neo -
Es gibt niemals dumme Fragen, sondern nur dumme Antworten!
  Mit Zitat antworten Zitat
romber

Registriert seit: 15. Apr 2004
Ort: Köln
1.166 Beiträge
 
Delphi 10 Seattle Professional
 
#22

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

  Alt 22. Aug 2005, 20:47
@Jelly: Erstmal vielen Dank für deine Mühe! An allen anderen auch vielen Dank!

Im Bezug auf deinen letzten Beitrag: zurzeit läuft den MS SQL Server im SQL Auth.-Modus. Muss ich unbedingt dieses auf Windows-Authenifizierung ändern? Wenn ich das doch ändere, muss ich für jeden Benutzer meines Programms (alle sind ausschließich außerhalb der Domain und der Arbeitsgruppe) ein Windows-Konto erstellen?
  Mit Zitat antworten Zitat
Benutzerbild von Mr_G
Mr_G

Registriert seit: 2. Sep 2004
Ort: Duisburg
468 Beiträge
 
Delphi 2006 Professional
 
#23

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

  Alt 22. Aug 2005, 21:04
Zitat von Jelly:
Zitat von Mr_G:
Wenn du die Benutzer allerdings in deinem Programm verwalten würdest könnte man sich das ersparen in dem dein Server-Proggi die Benutzerdatenbank verwaltet. Somit müssten die Clients nur wie gewohnt zu deinem Server connecten.
Und du denkst die selbstgebastelte Lösung läuft so stabil wie die im SQL Server integrierte
Wieso nicht? Wenn man das ordentlich macht sollte das doch ohne größere Probleme gehen, oder?

Zitat von Jelly:
Ich bleib dabei... Wenn ein SQL Server zur Verfügung steht, dann würd ich den nutzen. Damit gehst du nämlich sämtlichen evntuell auftretenden Problemen aus dem Weg... Ich habs grad getestet. Mein Programm verbindet sich mit dem SQL Server, unter dem Windowsaccount. Dadruch taucht eine Zeile in der sysprocess Tabelle auf. Ich knall mein Programm über den Taskmanager ab. Und 1 Sekunde später verschwindet der Eintrag in der Tabelle. Also mal im Ernst. Was ist daran so problematisch. Wer natürlich lieber mit Sockets und Server und Clients rumspielt, bitte schön. Ich bin der Meinung das ist das Rad neu erfinden... Und geschweige denn, obs denn auch nachher wirklich schön rund wird.
Ich persönlich würde das nach deinem Tipp (den ich natürlich gelesen hab) auch so machen, falls mir ein MSSQL-Server zur Verfügung steht. Nur führen (wie immer) viele Wege zum Ziel und romber schien ja einen anderen Weg einschlagen zu wollen
Jan
  Mit Zitat antworten Zitat
Benutzerbild von Jelly
Jelly

Registriert seit: 11. Apr 2003
Ort: Moestroff (Luxemburg)
3.741 Beiträge
 
Delphi 2007 Professional
 
#24

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

  Alt 22. Aug 2005, 21:05
Zitat von romber:
Im Bezug auf deinen letzten Beitrag: zurzeit läuft den MS SQL Server im SQL Auth.-Modus. Muss ich unbedingt dieses auf Windows-Authenifizierung ändern? Wenn ich das doch ändere, muss ich für jeden Benutzer meines Programms (alle sind ausschließich außerhalb der Domain und der Arbeitsgruppe) ein Windows-Konto erstellen?
Wenn du die Standardeinstellung vom SQL Server hast, so läuft ins beiden Modi, als SQL und Windowsauthentifizierung. Die Windowsauthentifizierung ist nicht rein auf die Domäne bezogen... Du kannst die Logins auch einfach über den Computernamen definieren, also etwa MEINPC\AccountName.

Ach ja, hier noch der benötigte ConnectionString wenn du über ADO gehst...
Code:
ConnectionString := format (
       'Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=%s;Data Source=%s',
       [DatabaseName,
        ServerName]) ;
  Mit Zitat antworten Zitat
romber

Registriert seit: 15. Apr 2004
Ort: Köln
1.166 Beiträge
 
Delphi 10 Seattle Professional
 
#25

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

  Alt 22. Aug 2005, 22:46
OK, ich glaube, Jellys Lösung ist in meinem Fall ideal.
Ein kleines Problemchen habe ich aber noch: stellen wir vor, die Anwendung hat die Verbindung mit der MSSQL-Datenbank, dann ändert Provider plötzlich die IP-Adresse. Verbindung wird abgebrochen, Anwendung läuft jedoch weiter. In der sysprocesses wird der entsprechende Datensatz sofort gelöscht. Das heisst, anderer User kann sich schon problemlos einlogen. Oder noch schlimmer: den Datensatz bleibt für "immer" da. Und das alles kann öffters vorkommen, weil die Provider heutzutage ändern die IP-Adressen ständig. Gibt es was dagegen?
  Mit Zitat antworten Zitat
jensw_2000
(Gast)

n/a Beiträge
 
#26

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

  Alt 23. Aug 2005, 01:28
Zitat:
OK, ich glaube, Jellys Lösung ist in meinem Fall ideal.
Ein kleines Problemchen habe ich aber noch: stellen wir vor, die Anwendung hat die Verbindung mit der MSSQL-Datenbank, dann ändert Provider plötzlich die IP-Adresse. Verbindung wird abgebrochen, Anwendung läuft jedoch weiter. In der sysprocesses wird der entsprechende Datensatz sofort gelöscht. Das heisst, anderer User kann sich schon problemlos einlogen. Und das alles kann öffters vorkommen, weil die Provider heutzutage ändern die IP-Adressen ständig. Gibt es was dagegen?
In diesem Fall musst du imho den "einfachen und sicheren Weg" verlassen und selbst was bauen.
Ich habe dir dazu mal schnell was ausgearbeitet.

Erstelle dir aber bitte eine eigene Datenbank, bitte keine Experimente mit der "Master-DB"

Hier mal der grobe Ablauf:

1. Du brauchst eine DB

> Enterprise Manager > Neue Datenbank > Name "LoginTest"

2. Du brauchst eine Tabelle in der Benutzer und Workstations gespeichert werden

SQL-Code:
USE LoginTest
GO
CREATE TABLE [SYS_ActiveUsers]
(
  [USERNAME] varchar(50) NOT NULL, -- Spalte für den Benutzernamen
  [Workstation] varchar(12) NOT NULL, -- Spalte für den Netbiosnamen der Workstarion
  [LAST_SEEN] datetime DEFAULT (getdate()) NOT NULL, -- Spalte für das letzte Login/KeepAlive eines Users
  [LOCK_TIME_SECS] int DEFAULT (600) NOT NULL -- (bedingte) Verfallszeit in Sekunden
)
ON [PRIMARY]
GO
3. Du brauchst eine SP, die beim Anmelden jedes einzelnen Users aufgerufen wird.
Dieser SP übergibst du den aktuellen Benutzernamen und den aktuellen PC-Namen.
Sie gibt dir ein BIT (AllowLogin) zurück, das du in deiner Software auswerten kannst.
Zudem gibt es ein BIT (Logout) mit dem du einen User regulär ausloggen kannst.

SQL-Code:
Use LoginTest
GO
CREATE PROCEDURE SYS_Check_Single_Login
(
 @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

-- 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 -- ggf. weglassen, damit das ganze Geraffel nicht zu starr wird ..
  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
    SET @AllowLogin=1
  END
  ELSE BEGIN

    IF EXISTS (
               SELECT USERNAME
               FROM SYS_ActiveUsers
               WHERE USERNAME=@USERNAME AND WORKSTATION <> @WORKSTATION
              )
    BEGIN
      -- Login des selben Users von einer anderen Workstation)
      -- "Verfallsdatum" prüfen, ggf. Last_Seen Updaten und AllowLogin setzen

      SELECT @TEMPTIME = LAST_SEEN,
             @TEMPDIFF = LOCK_TIME_SECS
       FROM SYS_ActiveUsers
       WHERE USERNAME=@USERNAME AND WORKSTATION <> @WORKSTATION
    
      IF ABS( DATEDIFF( SECOND,@TEMPTIME,GETDATE() ) ) > @TEMPDIFF
      BEGIN
        -- Das "Verfallsdatum" des letzten Logins ist abgelaufen
        -- Tabelle SYS_ActiveLogins um den verwaisten User bereinigen
        DELETE FROM SYS_ActiveUsers WHERE USERNAME=@USERNAME
        -- Eigenen USERNAME und Workstation in SYS_ActiveUsers eintragen
        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
        -- Das "Verfallsdatum" des letzten Logins ist nicht nicht überschritten
        -- Login verweigern
        SET @AllowLogin=0
      END
    END
    ELSE BEGIN
      -- USERNAME steht noch nicht in der Tabelle SYS_ActiveUsers
      -- Hinzufügen ...
      INSERT INTO SYS_ActiveUsers (USERNAME
                                  ,WORKSTATION
                                  ,LAST_SEEN
                                  ,LOCK_TIME_SECS)
                      VALUES (@USERNAME
                                  ,@WORKSTATION
                                  ,GETDATE()
                                  ,600) -- Timeout Sekunden (Verfallszeit)
      SET @AllowLogin=1
    END
  END

END

END

Diese SP rufst du beim Annmelden eines Users auf, und sie gibt dir, wie gesagt, ein Bit zurück, mit dem du prüfen kannst, ob sich der User anmelden darf.

Zum Ausloggen ruft du die selbe SP noch einmal auf, jedoch mit dem Parameter Logout = 1

Um das KeepAlive eines Users zu setzen, ruft du die SP alle 5-8 Minuten mal wieder auf ...


Für die Delphi würde ich mir an deiner Stelle eine kleine Function basteln:


Delphi-Quellcode:
var
  isAuthentificated:Boolean;

function CheckLogin(Logout:Boolean): Boolean;
  var SP:TAdoStoredProc;
begin
{
SQL - Syntax Hinweis
--------------------------------------------
CREATE PROCEDURE SYS_Check_Single_Login
(
@USERNAME VARCHAR(50) = NULL,
@WORKSTATION VARCHAR(12) = NULL,
@LOGOUT BIT = NULL,
@AllowLogin BIT = 0 OUTPUT
)
}


  SP:=TAdoStoredProc.create(self);
  SP.Connection:=MeineAdoConn; // Hier deine AdoConn
  try
    SP.Procedurename:='SYS_Check_Single_Login';
    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 wirde gelöscht, weil von Ihrer Arbeitsstation keine "KeepAlive-Aufrufe"'+#13#10+
                'an die SP "SYS_Check_Single_Login" gesendet wurden, bzw. deren Timing nicht passt ...');
  end;

  if (NOT Authentificated) AND (NOT Result) then
  begin
    Showmessage('Ein anderer Benutzer ist im Moment als "'+MeinUsername+'" angemeldet.'+#13#10+
                'Bitte verwenden Sie einen anderen Benutzernamen oder versuchen Sie es später noch einmal.');
  end;
 
  isAuthentificated:=(NOT Logout) AND RESULT;

end;

Hoffentlich ist das eine Lösung, die deinen Anforderungen annähernd entspricht ...

Schöne Grüße,
Jens



(bearbeitet - ein paar Kleinigkeiten korrigiert ...)
  Mit Zitat antworten Zitat
Benutzerbild von Jelly
Jelly

Registriert seit: 11. Apr 2003
Ort: Moestroff (Luxemburg)
3.741 Beiträge
 
Delphi 2007 Professional
 
#27

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

  Alt 23. Aug 2005, 08:59
Zitat von romber:
stellen wir vor, die Anwendung hat die Verbindung mit der MSSQL-Datenbank, dann ändert Provider plötzlich die IP-Adresse. Verbindung wird abgebrochen, Anwendung läuft jedoch weiter.
Nun, gegen diesen Missstand wirst du nicht viel machen können. Wenn die Verbindung weg ist, so besteht natürlich auch keine Verbindung mehr zur Datenbank. Da hilft dann wirklich nur noch noch selbstgezimmerte Lösung, wie die perfekt von Jens dargelegt wurde.
  Mit Zitat antworten Zitat
romber

Registriert seit: 15. Apr 2004
Ort: Köln
1.166 Beiträge
 
Delphi 10 Seattle Professional
 
#28

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

  Alt 23. Aug 2005, 15:52
@jensw_2000
im Bezug auf deinen letzten Beitrag: ich kann nicht ganz nachvollziehen, wann wird dieses Abschnitt de Code

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

Und hier ist noch ein Problem mit Logout. Ich übergebe Logout = 1 und anstatt den Datensatzt aus der Tabelle zu löschne, wird LAST_SEEN einfach aktualisiert. Da ist wohl noch ein kleines Fehler irgendwo in der SP.
  Mit Zitat antworten Zitat
jensw_2000
(Gast)

n/a Beiträge
 
#29

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

  Alt 23. Aug 2005, 16:23
Zitat:
Und hier ist noch ein Problem mit Logout. Ich übergebe Logout = 1 und anstatt den Datensatzt aus der Tabelle zu löschne, wird LAST_SEEN einfach aktualisiert. Da ist wohl noch ein kleines Fehler irgendwo in der SP.
Du hast recht.
Ich habe den SP Code (von oben) mal korrigiert anstatt ihn noch einmal komplett korrigiert zu posten, damit der Thread überschaubar bleibt ..


Zitat:
im Bezug auf deinen letzten Beitrag: ich kann nicht ganz nachvollziehen, wann wird dieses Abschnitt de Code

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



ausgeführt wird
Eigentlich nie

Naja,

Dafür, das der Code zum Großteil im Beitragseditor entstanden ist, was nicht ganz shlecht ...



Schöne Grüße,
Jens
  Mit Zitat antworten Zitat
romber

Registriert seit: 15. Apr 2004
Ort: Köln
1.166 Beiträge
 
Delphi 10 Seattle Professional
 
#30

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

  Alt 23. Aug 2005, 16:26
Zitat von jensw_2000:
...Dafür, das der Code zum Großteil im Beitragseditor entstanden ist, was nicht ganz shlecht ...
War sogar sehr-sehr gut Probiere gleich aus.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 3 von 4     123 4      


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 02:46 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