Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Verschiedene Funktionen verschiedenen Benutzer zuweisen (https://www.delphipraxis.net/139909-verschiedene-funktionen-verschiedenen-benutzer-zuweisen.html)

Jens Hartmann 8. Sep 2009 05:41


Verschiedene Funktionen verschiedenen Benutzer zuweisen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo,

ich möchte iin meinem Programm verschiedenen Benutzern verschiedene Rechte zuweisen. Die ganze Sache habe ich auch schon gelöst, allerdings so wie ich persönlich finden sehr kompliziert und vermutlich auch nicht nach dem Standart verfahren.

Momentan speicher ich die verschiedenen Einstellungen(siehe Anhang 1) in einer Firebird DB als Integervariablen.

Delphi-Quellcode:
function TBenutzerForm.SetRecord(ReadUser : TReadConfig):Boolean;
begin
  SetRecord := true;
  with ReadUser do
    begin
      BenutzerName := BenutzerEdit.Text;
      Passwort := PasswortEdit.Text;

      if VerbindenCheckBox.Checked = true then
        Verbinden := 1
      else
        Verbinden := 0;

      if TrennenCheckBox.Checked = true then
        Trennen := 1
      else
        Trennen := 0;
usw. Diesen Record schreibe ich dann in die DB. Finde ich persönlich auch noch ganz OK. Wäre die Frage ob das die Allgemeinheit auch so sieht.


Weiter geht es aber dann mit dem Programmstart. Dabei muss sind jetzt eigendlich alle Funktionen Enabled = false, da der USer sich erst mal Anmelden soll.

Gibt er seine Daten ein, lade ich die Einstellungen momentan so...

Delphi-Quellcode:

  case FPasswort.ShowModal of mrOK:
  begin
    Anmelden1.Enabled := false;
    Abmelden.Enabled := true;
    UserRights.BenutzerName := FPasswort.BenutzerED.Text;
    DM_PS.ReadUserRights(UserRights);
    with UserRights do
      begin
        if Verbinden = 1 then
          BTVerbinden.Enabled := true
        else
          BTVerbinden.Enabled := false;
        case Zentralen of
        0:AnlagenSetup1.Enabled := false;
        1:begin
          AnlagenSetup1.Enabled := true;
          Hardware.Hardwareanbindung.RGZentralentyp.Enabled := false;
          Hardware.Hardwareanbindung.SpeichernButton.Enabled := false;
          Hardware.Hardwareanbindung.UebernehmenButton.Enabled := false;
          end;
        2:begin
          AnlagenSetup1.Enabled := true;
          Hardware.Hardwareanbindung.RGZentralentyp.Enabled := false;
          Hardware.Hardwareanbindung.SpeichernButton.Enabled := false;
          Hardware.Hardwareanbindung.UebernehmenButton.Enabled := false;
          end;
        3:begin
          AnlagenSetup1.Enabled := true;
          Hardware.Hardwareanbindung.RGZentralentyp.Enabled := true;
          Hardware.Hardwareanbindung.SpeichernButton.Enabled := true;
          Hardware.Hardwareanbindung.UebernehmenButton.Enabled := true;
          end;
        end;
usw. Hierbei setzte ich ja jetzt viele Komponenten auf berechtigt oder nicht. Gewisse Personen sollen Lesen können, andere wiederum nicht. Wieder andere sollen neu´Anlegen können oder überschreiben. Das führt dazu, das ich vielen Komponenten in meinem Programm ja dieses sagen muss.

Kann man sowas nicht irgendwie beim Programmstart in der Komponenete selber vereinen . So in der Art, eine Eigenschaft der Komponente selbst. Soll heißen, Komponente sucht beim Start den integer Wert der im Record steht und setzt auf z.B. Visible = true oder false oder Enabled = true oder false.

Ich hoffe ich konnte jettzt beschreiben was ich suche.

Also danke schon mal und Gruß

Jens

jaenicke 8. Sep 2009 06:08

Re: Verschiedene Funktionen verschiedenen Benutzer zuweisen
 
Wie wäre es statt deinem zweiten Quelltext damit:
Delphi-Quellcode:
  if FPasswort.ShowModal = mrOK then
  begin
    Anmelden1.Enabled := false;
    Abmelden.Enabled := true;
    UserRights.BenutzerName := FPasswort.BenutzerED.Text;
    DM_PS.ReadUserRights(UserRights);
    BTVerbinden.Enabled := UserRights.Verbinden = 1;
    AnlagenSetup1.Enabled := UserRights.Zentralen > 0;
    Hardware.Hardwareanbindung.RGZentralentyp.Enabled := UserRights.Zentralen >= 3;
    Hardware.Hardwareanbindung.SpeichernButton.Enabled := UserRights.Zentralen >= 3;
    Hardware.Hardwareanbindung.UebernehmenButton.Enabled := UserRights.Zentralen >= 3;
Zudem könnte das Setzen der Rechte eigentlich gleich automatisch beim Setzen der Property BenutzerName oder falls vorhanden Passwort passieren statt separat.

Was das Speichern angeht:
Wozu der Record? Wenn es unter 30 Rechte oder so wären, reicht doch ein simpler Integerwert von 4 Byte mit gesetzten Bits aus, wenn es mehr sind, müsste halt noch einer her oder so. ;-)

hoika 8. Sep 2009 06:49

Re: Verschiedene Funktionen verschiedenen Benutzer zuweisen
 
Hallo,

warum Integer und nicht Boolean ?

Einen Record würde ich nicht nehmen.
Klar ist am Anfang noch nicht abzusehen,
wie viele Rechte es geben wird,
aber besser man sorgt vor.

Ich habe das so gelöst

Tabelle: User
Id Integer
Name VarChar(x)

(*
Optional
Tabelle: Rights
Id Integer
Name VarChar
*)

Tabelle: UserRights
Id Integer ("Autoinc")
UserId
RightId

Die Rechte sind durchnumeriert (Konstanten).

Das hat 2 Vorteile:
- Erweiterbar, neue Rechte bekommen einfach die nächsthöhere Nummer,
ohne das an der DB rumgeschraubt werden muss

- In UserRights stehen nur gesetzte Rechte,
hat der User ein Recht nicht, steht nichts in der Tabelle
Es werden damit nur die gesetzten Rechte geladen -> Performance


Heiko

Jens Hartmann 8. Sep 2009 21:39

Re: Verschiedene Funktionen verschiedenen Benutzer zuweisen
 
Hallo und danke erstmal,

ich finde beide Ansätze sehr interesant.

Zitat:

Zitat von jaenicke
Hardware.Hardwareanbindung.RGZentralentyp.Enabled := UserRights.Zentralen >= 3;

Das das so geht, wusste ich bis jetzt nicht. Werde ich aber aufjedenfall in Zukunft bestimmt mal nutzen.

Zitat:

Zitat von hoika
warum Integer und nicht Boolean

Integer, da meine RadioGroup´s ja mehr Werte haben könnten als nur 1 und 0. Liegt ja daran, das ich für gewisse Menüpunkte z.B. 4 verschiedene Rechter habe.

1. AUS (Menüpunkt ist nicht sichtbar)
2. EIN (Menüpunkt ist sichtbar aber nicht nutzbar) Soll die Möglichkeit schaffen, den Funktionsumpfang zun erkennen.
3. READ (Menüpunkt sichtbar, Menü oder Konfiguration kann geöffnet werden, aber es können keine Änderungen vorgenommen werden.
4. R/W (Alles frei. Lesen wie Schreiben)

Zitat:

Zitat von hoika
Die Rechte sind durchnumeriert (Konstanten).

Das hat 2 Vorteile:
- Erweiterbar, neue Rechte bekommen einfach die nächsthöhere Nummer,
ohne das an der DB rumgeschraubt werden muss
- In UserRights stehen nur gesetzte Rechte,
hat der User ein Recht nicht, steht nichts in der Tabelle
Es werden damit nur die gesetzten Rechte geladen -> Performance

Aber wie machst Du dann die Zuweisung. Hast Du in der Entwicklungsumgebung alles Enabled = false und Visible = false und setzt nur die Komponenten deren Nummer vorhanden ist auf Enabled oder Visible.

Schönen Abend noch

Gruss Jens

hoika 9. Sep 2009 07:06

Re: Verschiedene Funktionen verschiedenen Benutzer zuweisen
 
Hallo,

Zitat:

Aber wie machst Du dann die Zuweisung. Hast Du in der Entwicklungsumgebung alles Enabled = false und Visible = false und setzt nur die Komponenten deren Nummer vorhanden ist auf Enabled oder
Etwa so.


AUS nichts
EIN bRight2Locked
READ bRight2Read
R/W bRight2Write

Wären also 3 Rechte.
Ohne das "Suchtbar, aber disabled) wären es 2.

OK, mache ich das Recht als Integer,
komme ich mit einem Feld aus (0-3).
Das hätte ich wahrscheinlich dann auch so gemacht,
wenn die Anforderung so ist.

Ich würde aber trotzdem schon beim
Select auf >0 prüfen.

Warum ein Recht aus der DB laden, wenn eh 0 drinsteht.
Spart Traffic.


Heiko

Jens Hartmann 9. Sep 2009 21:53

Re: Verschiedene Funktionen verschiedenen Benutzer zuweisen
 
Zitat:

Zitat von hoika
Ich würde aber trotzdem schon beim
Select auf >0 prüfen.

Das leuchtet mir ein. Ich werde das in den nächsten Tag mal nacharbeiten und dann mal hier vorstellen.

Danke nochmal Gruß Jens

Jens Hartmann 10. Sep 2009 20:10

Re: Verschiedene Funktionen verschiedenen Benutzer zuweisen
 
So, ich habe das jetzt mal versucht zu realisieren, habe allerdings gerade ein Gedanken problem. Mein Problem ist, das der Momentan SQL Teil von mir wie folgt aus sieht. Aber wo kann ich da das >0 einbauen.

Delphi-Quellcode:
  Qry_PSUserCreate.SQL.Text := 'SELECT * FROM BENUTZER WHERE BENUTZER_NAME =:Benutzer';
  Qry_PSUserCreate.ParamByName('Benutzer').Value := UserRights.BenutzerName;
  Qry_PSUserCreate.Open;
    with UserRights do
      begin
        Verbinden := DM_PS.Qry_PSUserCreate.FieldByName('BERECHTIGUNG_VERBINDEN').AsInteger;
        Trennen := DM_PS.Qry_PSUserCreate.FieldByName('BERECHTIGUNG_TRENNEN').AsInteger;
        Beenden := DM_PS.Qry_PSUserCreate.FieldByName('BERECHTIGUNG_BEENDEN').AsInteger;
        Drucken := DM_PS.Qry_PSUserCreate.FieldByName('BERECHTIGUNG_DRUCKEN').AsInteger;
        ExportHTML := DM_PS.Qry_PSUserCreate.FieldByName('BERECHTIGUNG_EXPORT_HTML').AsInteger;
        ExportPDF := DM_PS.Qry_PSUserCreate.FieldByName('BERECHTIGUNG_EXPORT_PDF').AsInteger;
        DatenAuswert:= DM_PS.Qry_PSUserCreate.FieldByName('BERECHTIGUNG_DATENAUSWERTUNG').AsInteger;
        Schnittstellenpar := DM_PS.Qry_PSUserCreate.FieldByName('BERECHTIGUNG_SCHNITTSTELLE').AsInteger;
        KomOptionen := DM_PS.Qry_PSUserCreate.FieldByName('BERECHTIGUNG_KOM_OPTIONEN').AsInteger;
        EMailSetup := DM_PS.Qry_PSUserCreate.FieldByName('BERECHTIGUNG_EMAIL_SETUP').AsInteger;
        Zentralen := DM_PS.Qry_PSUserCreate.FieldByName('BERECHTIGUNG_ZENTRALEN').AsInteger;
        Ansichten:= DM_PS.Qry_PSUserCreate.FieldByName('BERECHTIGUNG_ANSICHT').AsInteger;
        Benutzerverwaltung := DM_PS.Qry_PSUserCreate.FieldByName('BERECHTIGUNG_BENUTZER').AsInteger;
        EigeneRechte := DM_PS.Qry_PSUserCreate.FieldByName('BERECHTIGUNG_EIGENE_RECHTE').AsInteger;
        Abmelden := DM_PS.Qry_PSUserCreate.FieldByName('EINSTELLUNG_ABMELDEN').AsInteger;
        AnzahlDS := DM_PS.Qry_PSUserCreate.FieldByName('EINSTELLUNG_ANZAHL_DATENSAETZE').AsString;
        Zeit := TimeToStr(DM_PS.Qry_PSUserCreate.FieldByName('EINSTELLUNG_ZEIT').AsDateTime);
      end;
  end
Danke schon mal

Gruß Jens

jaenicke 10. Sep 2009 20:59

Re: Verschiedene Funktionen verschiedenen Benutzer zuweisen
 
Nein, das war anders gemeint. Du versuchst die Berechtigung zu finden, suchst also alle Einträge, deren Rechte-ID mit deiner aktuellen übereinstimmt. Ist die Anzahl der Ergebnisse größer als 0, dann ist die Berechtigung vorhanden.

Ich selbst würde aber wie gesagt lieber gleich einzelne Bits nehmen, das ist noch einfacher.

Jens Hartmann 10. Sep 2009 22:04

Re: Verschiedene Funktionen verschiedenen Benutzer zuweisen
 
Ja, aber wie kann ich mir das vorstellen.

Gruß Jens

jaenicke 10. Sep 2009 22:40

Re: Verschiedene Funktionen verschiedenen Benutzer zuweisen
 
Was meinen Vorschlag angeht:
Delphi-Quellcode:
const
  USERRIGHT_CONNECT = 1;
  USERRIGHT_DISCONNECT = 2;
  USERRIGHT_CLOSE = 4;
  USERRIGHT_PRINT = 8;
  USERRIGHT_EXPORT_HTML = 16;
  USERRIGHT_EXPORT_PDF = 32;
  ...

// Integerwert auf Recht prüfen:
  if UserRights and USERRIGHT_CONNECT > 0 then
    ...

// Recht setzen:
  UserRights := UserRights or USERRIGHT_CONNECT;
// Recht entfernen:
  UserRights := UserRights and not USERRIGHT_CONNECT;
So kannst du die Bits einzeln benutzen und nur einen oder bei mehr Rechten mehrere Integerwerte benutzen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:18 Uhr.
Seite 1 von 2  1 2      

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