Benutzer und Rechte (Anwendung versus Datenbank)

Andre

Benutzer
Beiträge
14
Wir haben eine bestehende C++ Anwendung, die derzeit (noch) auf einer Accessdatenbank aufsetzt, und in absehbarer Zeit auf Serverdatenbanken migriert werden soll, im ersten Schritt auf SQL Server (aber auch andere wie z.B. Firebird & Oracle könnten folgen).

In der Anwendung gibt es ein Benutzerkonzept (Benutzer/Rollen/Rechte...) bei der bislang die eigentliche Logik komplett in der Anwendung abläuft, es also keine korrespondierenden Datenbankbenutzer gibt. Diese Rechte können auch nicht 1:1 Datenbankaktionen zugeordnet werden.

In Zukunft soll ein kleiner Teil der Logik in der Datenbank ablaufen (Seien es nun Datensätze die automatisch beim Anlegen eines anderen erzeugt werden müssen, oder STPs die Kunden für den Import bereit gestellt werden sollen).

Nun wäre es schön, wenn man einen an der Datenbank angemeldeten Benutzer auch direkt einem Anwendungsbenutzer (Für den z.B. ein Eintrag in einer speziellen Tabelle mit einer BenutzerId existiert) zuordnen könnte, so das man Beispielsweise in einer STP die zugehörige BenutzerId abfragen und verwenden kann (z.B. für Historieneinträge etc.).

Nach meinen Verständnis könnte man nun z.B. für jeden bisherigen Benutzer beispielsweise einen gleichnamigen Benutzer für die Datenbankinstanz anlegen, und darüber eine Verbindung herstellen, ein weiterer Kundenwunsch ist es, das gar keine Anmeldung mehr an unserer Anwendung nötig ist, und man sich mit seinem Windowsbenutzer anmeldet (was imho bei dem SQL Server ja möglich sein müsste wenn man die Anmeldung über die Windowsbenutzer zulässt und irgendwie eine Zuordnung von diesen zu "unseren" Anwendungsbenutzern herstellen könnte). Wie stellt man am besten die Verbindung her, auch in Hinsicht auf die Anmeldung an unserer Anwendung?

Wenn ich die Windowsbenutzer einmal ausklammere und es richtig verstehe könnte man z.B. eine STP veröffentlichen, über die, die Anmeldung erfolgt:
  1. Unser Programm wird gestatet, die Anmeldemaske erscheint in der man sein Kürzel/Kennwort eingibt.
  2. Eine STP wird aufgerufen die die Zuordnung zu dem Benutzer macht:
  1. Prüfen ob Benutzerdaten (Über Tabelle) existieren und stimmen.
  2. [Falls noch nicht existent] Einen DB-Benutzer der mit diesem Benutzerdatensatz korrespondiert anlegen.
  3. Dem angemeldeten Benutzer (Über Serverlogin) diesen Datenbankbenutzer zuordnen.
Liege ich hiermit einigermaßen richtig? Gibt es bessere Möglichkeiten? Wie könnte man dies mit den Windowsbenutzern regeln?
 
Werbung:
Ich bin mir nicht ganz sicher, ob ich verstande habe was du vor hast. Aber: Es gibt bei SQL Studio in der Anmeldemaske die Möglichkeit, sich mit den Windows Authentifizierung an der DB anzumelden. Wenn also für den Windows Benutzer ein gleichnamiger SQL Benutzer angelegt wurde und dieser das gleiche PW hat dann kannst du damit auch DB Zugriffsrechte verwalten.

Diesen Weg würde ich auf jedenfall einer Bastellösung (Tabelle im Hintergrund abfragen etc.) vorziehen, weil du ja sonst dich um Dinge wie SQL Injection in der Anmeldemaske etc. selber kümmern müsstest.

Ich verstehe aber nicht, wie der Anwender mit der DB arbeiten soll ohne die Anwendung zu benutzen, mit dem SQL Studio?
 
Aber: Es gibt bei SQL Studio in der Anmeldemaske die Möglichkeit, sich mit den Windows Authentifizierung an der DB anzumelden. Wenn also für den Windows Benutzer ein gleichnamiger SQL Benutzer angelegt wurde und dieser das gleiche PW hat dann kannst du damit auch DB Zugriffsrechte verwalten.

Das ist mir bewusst, hat aber nichts mit der Anmeldung zu tun, die mir in einer Client-Server Architektur (mit unterschiedlichen Datenbanken im Hintergrund) hilft, und zudem keine Verbindung zwischen den Datenbankbenutzern und den Benutzern in einer Benutzerverwaltung einer Anwendung herstellt. Es gibt nun einmal Dinge, die man nicht in einer Datenbank abbildet, und Rechte die sich nicht 1:1 auf Datenbanken abbilden lassen.

Daher: Es führt kein Weg an der Benutzertabelle vorbei, da die Benutzerverwaltung von uns sich weniger auf die Datenbank, sondern mehr auf die Anwendungslogik bezieht, und irgendwo diese Informationen abgelegt werden müssen. Für einige STPs wäre es aber gut wenn man eine Anmeldung eindeutig unseren "Benutzern" zuordnen kann, Sprich auch direkt oder indirekt die Id aus der entsprechenden Tabelle bekommt.

Diesen Weg würde ich auf jedenfall einer Bastellösung (Tabelle im Hintergrund abfragen etc.) vorziehen, weil du ja sonst dich um Dinge wie SQL Injection in der Anmeldemaske etc. selber kümmern müsstest.

Ich verstehe aber nicht, wie der Anwender mit der DB arbeiten soll ohne die Anwendung zu benutzen, mit dem SQL Studio?

Er soll sich mit der Anmeldung an der Datenbank anmelden. Nur habe ich bislang keinerlei Literatur gefunden die nicht ausschließlich Einseitig aus Sicht eines Anwenderprogrammierers (ohne Sicherheitskonzepte auf der Datenbank, ohne STPs...) oder eines Datenbankadministrators (ohne Sicht auf die Anwendungsseite, und meist auf eine Datenbank beschränkt) eingeht.

Das beides nun einmal irgendwie kombiniert werden könnte scheint kaum einer je zu Berücksichtigen.

Um was es mir jetzt geht ist eine Möglichkeit:
a) Auf Datenbankseite irgendwie auf "unsere" Benutzer zurück schließen zu können.
b) Möglichst auch eine Anmeldung über den Windowsbenutzer optional zu ermöglichen.
 
Jetzt verstehe ich schon besser was du vor hast :), kann dir aber leider wenig Rat geben. Für b) musst du aber in jedem Fall pro Windows Benutzer oder pro Rechtegruppe einen Benutzer in der DB anlegen, um das durchzusetzen.
 
Werbung:
So weit war ich auch schon, ich überlege nur das beste Vorgehen (und vielleicht findet jemand Fehler in meinen Gedankengängen). Ich habe mich noch nicht im Detail mit der Zugriffssteuerung vom SQL Server beschäftigt, daher werde ich bei den Begriffen wohl etwas daneben liegen.

Ich werde im folgenden die Begriffe wie folgt verwenden:
Serveranmeldung (Anmeldung auf Ebene des SQL-Server, z.B. über den Windowsanmeldename, sa...)
Datenbankbenutzer (Anmeldung/Datenbankbenutzer der nur lokal für die Datenbank dient)
Anwendungsbenutzer (In unserer Anwendungslogik verwendete Benutzer, auch wenn diese mit der Datenbankanmeldung korrespondieren sollten, haben sie etwas andere Bedeutung).

Mein Problem ist nun wie ich diese am besten miteinander kombinieren kann, ich versuche hier einfach einmal meine Überlegung zusammen zu schreiben [Sofern dies so möglich ist]:

1. Unsere Anwendung (C++ Client) wird gestartet.
2. Es werden 2 Konfigurationseinstellungen eingelesen (z.B. aus einer ini/Registry...) die erstens festlegen ob eine Anmeldung über das Windowskonto möglich ist [a], und wenn ja, ob man automatisch angemeldet werden soll .
3. Eine Anmeldungsmaske erscheint [sofern b nicht gesetzt ist] in der man Benutzernamen/Kennwort eingeben kann, oder [falls a gesetzt ist] sich alternativ über das Windowskonto anmeldet.
4. a) Bei einer Windowsanmeldung wird eine für die Serveranmeldung verfügbare STP aufgerufen in der geprüft wird, ob bereits ein korrespondierender Datenbankbenutzer und Anwendungsbenutzer (DB-Eintrag) existiert. Wenn nicht, wird sowohl der DB-Eintrag generiert (noch inaktiv, ohne Anwendungsrechte...) als auch der Datenbankbenutzer erzeugt (noch ohne Zugriffsrechte auf der DB, die werden erst bei einer Aktivierung in der Anwendung erzeugt). Wenn der Datensatz existiert und aktiviert wurde, wird der Datenbankbenutzer an die Serveranmeldung gebunden ("execute as"???).
4. b) Bei einer Anmeldung über Benutzernamen/Kennwort meldet sich die Anwendung über einen von uns vorgegebene Serveranmeldung an, ansonsten läuft es ähnlich wie bei a) nur das der Benutzer bereits existieren muss.
 
Zurück
Oben