Die Codefragmente auf dieser Seite müssen wie folgt importiert werden, wenn Sie sich außerhalb der pyqgis-Konsole befinden:
1from qgis.core import (
2 QgsApplication,
3 QgsRasterLayer,
4 QgsAuthMethodConfig,
5 QgsDataSourceUri,
6 QgsPkiBundle,
7 QgsMessageLog,
8)
9
10from qgis.gui import (
11 QgsAuthAuthoritiesEditor,
12 QgsAuthConfigEditor,
13 QgsAuthConfigSelect,
14 QgsAuthSettingsWidget,
15)
16
17from qgis.PyQt.QtWidgets import (
18 QWidget,
19 QTabWidget,
20)
21
22from qgis.PyQt.QtNetwork import QSslCertificate
14. Authentifizierungsinfrastruktur
14.1. Einführung
Die Benutzerreferenz der Authentifizierungsinfrastruktur kann im Benutzerhandbuch im Abschnitt :ref`authentication_overview` nachgelesen werden .
In diesem Kapitel werden die Best Practices für die Verwendung des Authentifizierungssystems aus Entwicklersicht beschrieben.
Das Authentifizierungssystem wird in QGIS Desktop häufig von Datenanbietern verwendet, wenn Anmeldeinformationen für den Zugriff auf eine bestimmte Ressource erforderlich sind, z. B. wenn eine Schicht eine Verbindung zu einer Postgres-Datenbank herstellt.
Es gibt auch einige Widgets in der QGIS-GUI-Bibliothek, mit denen Plugin-Entwickler die Authentifizierungsinfrastruktur einfach in ihren Code integrieren können:
A good code reference can be read from the authentication infrastructure tests code.
Warnung
Aufgrund der Sicherheitsbeschränkungen, die beim Entwurf der Authentifizierungsinfrastruktur berücksichtigt wurden, wird Python nur eine ausgewählte Teilmenge der internen Methoden zur Verfügung gestellt!
14.2. Glossar
Hier finden Sie eine Definition der in diesem Kapitel am häufigsten behandelten Objekte.
- Master Password
Kennwort zum Ermöglichen des Zugriffs und zum Entschlüsseln von Anmeldeinformationen, die in der QGIS-Authentifizierungsdatenbank gespeichert sind
- Authentifizierungsdatenbank
Eine mit einem Master Password verschlüsselte SQLite-Datenbank,
qgis-auth.db
in der die Authentifizierungskonfiguration gespeichert ist, z.B. Benutzer / Passwort, persönliche Zertifikate und Schlüssel, Zertifizierungsstellen- Authentication DB
- Authentifikationskonfiguration
A set of authentication data depending on Authentication Method. e.g Basic authentication method stores the couple of user/password.
- Authentication Config
- Authentication Method
Eine bestimmte Methode zur Authentifizierung. Jede Methode verfügt über ein eigenes Protokoll, mit dem die authentifizierte Ebene erreicht wird. Jede Methode wird als gemeinsam genutzte Bibliothek implementiert, die während der Initialisierung der QGIS-Authentifizierungsinfrastruktur dynamisch geladen wird.
14.3. QgsAuthManager als Einstiegspunkt
Der QgsAuthManager
Singleton ist der Einstiegspunkt für die Verwendung der in der QGIS-verschlüsselten Authentication DB gespeicherten Anmeldeinformationen , dh der qgis-auth.db
Datei unter dem aktiven Benutzerprofilordner.
Diese Klasse kümmert sich um die Benutzerinteraktion indem Sie aufgefordert werden, ein Hauptkennwort festzulegen, oder indem Sie es transparent verwenden, um auf verschlüsselte gespeicherte Informationen zuzugreifen.
14.3.1. Initiieren Sie den Manager und legen Sie das Master-Passwort fest
Der folgende Codeschnippsel enthält ein Beispiel zum Festlegen des Hauptkennworts, um den Zugriff auf die Authentifizierungseinstellungen zu öffnen. Codekommentare sind wichtig, um das Snippet zu verstehen.
1authMgr = QgsApplication.authManager()
2
3# check if QgsAuthManager has already been initialized... a side effect
4# of the QgsAuthManager.init() is that AuthDbPath is set.
5# QgsAuthManager.init() is executed during QGIS application init and hence
6# you do not normally need to call it directly.
7if authMgr.authenticationDatabasePath():
8 # already initialized => we are inside a QGIS app.
9 if authMgr.masterPasswordIsSet():
10 msg = 'Authentication master password not recognized'
11 assert authMgr.masterPasswordSame("your master password"), msg
12 else:
13 msg = 'Master password could not be set'
14 # The verify parameter checks if the hash of the password was
15 # already saved in the authentication db
16 assert authMgr.setMasterPassword("your master password",
17 verify=True), msg
18else:
19 # outside qgis, e.g. in a testing environment => setup env var before
20 # db init
21 os.environ['QGIS_AUTH_DB_DIR_PATH'] = "/path/where/located/qgis-auth.db"
22 msg = 'Master password could not be set'
23 assert authMgr.setMasterPassword("your master password", True), msg
24 authMgr.init("/path/where/located/qgis-auth.db")
14.3.2. Die authdb mit einem neuen Eintrag für die Authentifizierungskonfiguration befüllen
Jeder gespeicherte Berechtigungsnachweis ist eine Authentication Configuration-Instanz der Klasse QgsAuthMethodConfig
, auf die mit einer eindeutigen Zeichenfolge wie der folgenden zugegriffen wird:
authcfg = 'fm1s770'
Diese Zeichenfolge wird beim Erstellen eines Eintrags mithilfe der QGIS-API oder -GUI automatisch generiert. Es kann jedoch hilfreich sein, sie manuell auf einen bekannten Wert festzulegen, falls die Konfiguration (mit unterschiedlichen Anmeldeinformationen) von mehreren Benutzern innerhalb einer Organisation gemeinsam genutzt werden muss.
QgsAuthMethodConfig
is the base class
for any Authentication Method.
Any Authentication Method sets a configuration hash map where authentication
information will be stored. Hereafter a useful snippet to store PKI-path
credentials for a hypothetical alice user:
1authMgr = QgsApplication.authManager()
2# set alice PKI data
3config = QgsAuthMethodConfig()
4config.setName("alice")
5config.setMethod("PKI-Paths")
6config.setUri("https://example.com")
7config.setConfig("certpath", "path/to/alice-cert.pem" )
8config.setConfig("keypath", "path/to/alice-key.pem" )
9# check if method parameters are correctly set
10assert config.isValid()
11
12# register alice data in authdb returning the ``authcfg`` of the stored
13# configuration
14authMgr.storeAuthenticationConfig(config)
15newAuthCfgId = config.id()
16assert newAuthCfgId
14.3.2.1. Verfügbare Authentifizierungsmethoden
Authentication Method-Bibliotheken werden während der Initialisierung des Authentifizierungsmanagers dynamisch geladen. Verfügbare Authentifizierungsmethoden sind:
Basic
Benutzer- und PasswortauthentifizierungEsri-Token
ESRI token basierte AuthentifizierungIdentity-Cert
Authentifizierung des IdentitätszertifikatsOAuth2
OAuth2-AuthentifizierungPKI-Paths
PKI-PfadauthentifizierungPKI-PKCS#12
PKI PKCS # 12-Authentifizierung
14.3.2.3. PKI Bündel mit QgsPkiBundle verwalten
Eine Convenience-Klasse zum Packen von PKI-Bundles, die aus SslCert-, SslKey- und CA-Ketten bestehen, ist die Klasse QgsPkiBundle
. Nachfolgend ein Ausschnitt, um ein Passwort zu erhalten:
1# add alice cert in case of key with pwd
2caBundlesList = [] # List of CA bundles
3bundle = QgsPkiBundle.fromPemPaths( "/path/to/alice-cert.pem",
4 "/path/to/alice-key_w-pass.pem",
5 "unlock_pwd",
6 caBundlesList )
7assert bundle is not None
8# You can check bundle validity by calling:
9# bundle.isValid()
Informationen zum Extrahieren von Zertifikaten / Schlüsseln / Zertifizierungsstellen aus dem Bundle finden Sie in der Klassendokumentation zu QgsPkiBundle
.
14.3.3. Entfernen eines Eintrags aus authdb
Wir können einen Eintrag aus der Authentication Database entfernen, indem wir seine authcfg
Kennung mit dem folgenden Snippet verwenden:
authMgr = QgsApplication.authManager()
authMgr.removeAuthenticationConfig( "authCfg_Id_to_remove" )
14.3.4. authcfg Erweiterung dem QgsAuthManager überlassen
Der beste Weg, auf einen verwenden Authentication Config in der gespeicherten Authentication DB zu verweisen besteht in der eindeutigen Kennung authcfg
. Erweitern bedeutet, dass es von einem Bezeichner in einen vollständigen Satz von Anmeldeinformationen konvertiert wird. Die beste Vorgehensweise für die Verwendung gespeicherter Authentifizierungskonfigurationen besteht darin, sie automatisch vom Authentifizierungsmanager verwalten zu lassen. Die übliche Verwendung einer gespeicherten Konfiguration besteht darin, eine Verbindung zu einem authentifizierungsfähigen Dienst wie einem WMS oder WFS oder zu einer DB-Verbindung herzustellen.
Bemerkung
Take into account that not all QGIS data providers are integrated with the
Authentication infrastructure. Each authentication method, derived from the
base class QgsAuthMethod
and support a different set of Providers. For example the certIdentity()
method supports the following list
of providers:
authM = QgsApplication.authManager()
print(authM.authMethod("Identity-Cert").supportedDataProviders())
Beispielausgabe:
['ows', 'wfs', 'wcs', 'wms', 'postgres']
Um beispielsweise mit gespeicherten Anmeldeinformationen, die mit authcfg = 'fm1s770'
gekennzeichnet sind , auf einen WMS-Dienst zuzugreifen , müssen Sie lediglich die URL in der Datenquelle wie im folgenden Snippet verwenden:
1authCfg = 'fm1s770'
2quri = QgsDataSourceUri()
3quri.setParam("layers", 'usa:states')
4quri.setParam("styles", '')
5quri.setParam("format", 'image/png')
6quri.setParam("crs", 'EPSG:4326')
7quri.setParam("dpiMode", '7')
8quri.setParam("featureCount", '10')
9quri.setParam("authcfg", authCfg) # <---- here my authCfg url parameter
10quri.setParam("contextualWMSLegend", '0')
11quri.setParam("url", 'https://my_auth_enabled_server_ip/wms')
12rlayer = QgsRasterLayer(str(quri.encodedUri(), "utf-8"), 'states', 'wms')
Im obigen Fall achtet der wms
Anbieter darauf, den authcfg
URI-Parameter unmittelbar vor dem Einstellen der HTTP-Verbindung mit Anmeldeinformationen zu erweitern .
Warnung
Der Entwickler sollte die authcfg
Erweiterung der Klasse QgsAuthManager
überlassen um sicherzustellen, dass die Erweiterung nicht zu früh erfolgt.
Normalerweise wird eine URI-String, der mit der Klasse QgsDataSourceURI
erstellt wurde, folgendermaßen verwendet, um eine Datenquelle festzulegen:
authCfg = 'fm1s770'
quri = QgsDataSourceUri("my WMS uri here")
quri.setParam("authcfg", authCfg)
rlayer = QgsRasterLayer( quri.uri(False), 'states', 'wms')
Bemerkung
Der Parameter False
ist wichtig, um eine vollständige Erweiterung der URI um eine in der URI vorhandene authcfg
zu vermeiden.
14.3.4.1. PKI-Beispiele mit anderen Datenanbietern
Andere Beispiel können direkt in den QGIS-Tests gelesen werden, wie in test_authmanager_pki_ows oder test_authmanager_pki_postgres.
14.4. Plugins an die Authentifizierungsinfrastruktur anpassen
Viele Plugins von Drittanbietern verwenden httplib2 oder andere Python-Netzwerkbibliotheken, um HTTP-Verbindungen zu verwalten, anstatt sie mit QgsNetworkAccessManager
und der zugehörigen Authentifizierungsinfrastruktur zu integrieren.
Um diese Integration zu erleichtern, wurde eine Python-Hilfsfunktion namens NetworkAccessManager
erstellt. Den Code finden Sie hier<https://github.com/rduivenvoorde/pdokservicesplugin/blob/master/networkaccessmanager.py>.
Die Hilfsklasse kann wie folgt verwendet werden:
1http = NetworkAccessManager(authid="my_authCfg", exception_class=My_FailedRequestError)
2try:
3 response, content = http.request( "my_rest_url" )
4except My_FailedRequestError, e:
5 # Handle exception
6 pass
14.5. Authentifizierungs-GUIs
In diesem Abschnitt sind die verfügbaren GUIs aufgeführt, die zur Integration der Authentifizierungsinfrastruktur in benutzerdefinierte Schnittstellen von Nutzern sind.
14.5.1. GUI zur Auswahl von Anmeldeinformationen
Zur Auswahl einer Authentifizierungskonfiguration aus dem in der Authentifizierungsdatenbank gespeicherten Satz ist die GUI-Klasse QgsAuthConfigSelect
verfügbar.
Sie kann folgendermaßen verwendet werden:
1# create the instance of the QgsAuthConfigSelect GUI hierarchically linked to
2# the widget referred with `parent`
3parent = QWidget() # Your GUI parent widget
4gui = QgsAuthConfigSelect( parent, "postgres" )
5# add the above created gui in a new tab of the interface where the
6# GUI has to be integrated
7tabGui = QTabWidget()
8tabGui.insertTab( 1, gui, "Configurations" )
Das obige Beispiel stammt aus dem QGIS- Quellcode code. Der zweite Parameter des GUI-Konstruktors bezieht sich auf den Datenanbietertyp. Der Parameter wird verwendet, um die kompatiblen Authentication Method s auf den angegebenen Anbieter einzuschränken.
14.5.2. Authentifizierungseditor GUI
Die vollständige Oberfläche für die Verwaltung von Berechtigungen, Authorities und zum Zugriff auf Authentifizierungswerkzeuge wird mit der Klasse QgsAuthEditorWidgets
gesteuert.
Sie kann folgendermaßen verwendet werden:
1# create the instance of the QgsAuthEditorWidgets GUI hierarchically linked to
2# the widget referred with `parent`
3parent = QWidget() # Your GUI parent widget
4gui = QgsAuthConfigSelect( parent )
5gui.show()
Ein integriertes Beipiel ist im dazugehörigen test zu finden.