Viktigt
Översättning är en gemenskapsinsats du kan gå med i. Den här sidan är för närvarande översatt till 100.00%.
14. Infrastruktur för autentisering
Råd
Kodsnuttarna på den här sidan behöver följande import om du befinner dig utanför pyqgis-konsolen:
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.1. Introduktion
Användarreferenser för autentiseringsinfrastrukturen kan läsas i användarhandboken i avsnittet Översikt över autentiseringssystem.
I det här kapitlet beskrivs de bästa metoderna för att använda Authentication-systemet ur ett utvecklarperspektiv.
Autentiseringssystemet används ofta i QGIS Desktop av dataleverantörer när det krävs autentiseringsuppgifter för att komma åt en viss resurs, t.ex. när ett skikt upprättar en anslutning till en Postgres-databas.
Det finns också några widgetar i QGIS gui-bibliotek som plugin-utvecklare kan använda för att enkelt integrera autentiseringsinfrastrukturen i sin kod:
En bra kodreferens kan läsas från autentiseringsinfrastrukturen tests code.
Varning
På grund av de säkerhetsbegränsningar som beaktades under utformningen av autentiseringsinfrastrukturen exponeras endast en utvald delmängd av de interna metoderna för Python.
14.2. Ordlista
Här följer några definitioner av de vanligaste objekten som behandlas i detta kapitel.
- Huvudlösenord
Lösenord för att tillåta åtkomst och dekryptera autentiseringsuppgifter som lagras i QGIS Authentication DB
- Autentiseringsdatabas
En Master Password krypterad sqlite db
qgis-auth.db
där Authentication Configuration lagras. t.ex. användare/lösenord, personliga certifikat och nycklar, certifikatutfärdare- Autentisering DB
- Konfiguration av autentisering
En uppsättning autentiseringsdata beroende på Authentication Method. t.ex. Basic authentication method lagrar paret användare/lösenord.
- Konfig för autentisering
- Autentiseringsmetod
En specifik metod som används för att bli autentiserad. Varje metod har sitt eget protokoll som används för att uppnå den autentiserade nivån. Varje metod är implementerad som ett delat bibliotek som laddas dynamiskt under initieringen av QGIS autentiseringsinfrastruktur.
14.3. QgsAuthManager ingångspunkten
Singletonen QgsAuthManager
är ingångspunkten för att använda de autentiseringsuppgifter som lagras i QGIS krypterade Authentication DB, dvs. filen qgis-auth.db
under den aktiva mappen user profile.
Denna klass tar hand om användarinteraktionen: genom att be om att få ange ett huvudlösenord eller genom att på ett transparent sätt använda det för att komma åt krypterad lagrad information.
14.3.1. Starta chefen och ställ in huvudlösenordet
Följande kodavsnitt ger ett exempel på hur du anger huvudlösenord för att öppna åtkomsten till autentiseringsinställningarna. Kodkommentarerna är viktiga för att förstå utdraget.
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. Fyll authdb med en ny post för konfiguration av autentisering
Alla lagrade referenser är en Authentication Configuration-instans av QgsAuthMethodConfig
-klassen som nås med hjälp av en unik sträng som den följande:
authcfg = 'fm1s770'
denna sträng genereras automatiskt när en post skapas med QGIS API eller GUI, men det kan vara bra att manuellt ställa in den på ett känt värde om konfigurationen måste delas (med olika autentiseringsuppgifter) mellan flera användare inom en organisation.
QgsAuthMethodConfig
är basklassen för alla Authentication Method. Varje autentiseringsmetod anger en konfigurationshashkarta där autentiseringsinformation lagras. Nedan följer ett användbart utdrag för att lagra PKI-path-autentiseringsuppgifter för en hypotetisk alice-användare:
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. Tillgängliga autentiseringsmetoder
Authentication Method-bibliotek laddas dynamiskt under init av autentiseringshanteraren. Tillgängliga autentiseringsmetoder är:
Basic
Autentisering av användare och lösenordEsriToken
ESRI tokenbaserad autentiseringIdentity-Cert
Autentisering av identitetscertifikatOAuth2
OAuth2-autentiseringPKI-Paths
PKI-sökvägar autentiseringPKI-PKCS#12
PKI PKCS#12 autentisering
14.3.2.3. Hantera PKI-bundlar med QgsPkiBundle
En praktisk klass för att packa PKI-bundlar som består av SslCert, SslKey och CA-kedja är QgsPkiBundle
-klassen. Nedan följer ett utdrag för att få lösenordsskydd:
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()
Se QgsPkiBundle
klassdokumentation för att extrahera cert/key/CAs från paketet.
14.3.3. Ta bort en post från authdb
Vi kan ta bort en post från Authentication Database med hjälp av dess authcfg
identifierare med följande utdrag:
authMgr = QgsApplication.authManager()
authMgr.removeAuthenticationConfig( "authCfg_Id_to_remove" )
14.3.4. Lämna authcfg-utvidgningen till QgsAuthManager
Det bästa sättet att använda en Authentication Config som finns lagrad i Authentication DB är att referera till den med den unika identifieraren authcfg
. Expandera innebär att konvertera den från en identifierare till en komplett uppsättning autentiseringsuppgifter. Den bästa metoden för att använda lagrade Authentication Config är att låta den hanteras automatiskt av Authentication Manager. Den vanligaste användningen av en lagrad konfiguration är att ansluta till en autentiseringsaktiverad tjänst som en WMS eller WFS eller till en DB-anslutning.
Observera
Tänk på att inte alla QGIS-dataleverantörer är integrerade med autentiseringsinfrastrukturen. Varje autentiseringsmetod härstammar från basklassen QgsAuthMethod
och stöder en annan uppsättning leverantörer. Till exempel stöder metoden certIdentity()
följande lista med leverantörer:
authM = QgsApplication.authManager()
print(authM.authMethod("Identity-Cert").supportedDataProviders())
Exempel på utdata:
['ows', 'wfs', 'wcs', 'wms', 'postgres']
Om du t.ex. vill komma åt en WMS-tjänst med hjälp av lagrade autentiseringsuppgifter som identifierats med authcfg = 'fm1s770'
, behöver du bara använda authcfg
i datakällans URL som i följande utdrag:
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')
I det övre fallet kommer leverantören wms
att se till att expandera URI-parametern authcfg
med referenser precis innan HTTP-anslutningen ställs in.
Varning
Utvecklaren skulle behöva lämna authcfg
expansion till QgsAuthManager
, på detta sätt kommer han att vara säker på att expansion inte görs för tidigt.
Vanligtvis används en URI-sträng, byggd med hjälp av klassen QgsDataSourceURI
, för att ange en datakälla på följande sätt:
authCfg = 'fm1s770'
quri = QgsDataSourceUri("my WMS uri here")
quri.setParam("authcfg", authCfg)
rlayer = QgsRasterLayer( quri.uri(False), 'states', 'wms')
Observera
Parametern False
är viktig för att undvika fullständig URI-expansion av id:t authcfg
som finns i URI:n.
14.3.4.1. PKI-exempel med andra dataleverantörer
Andra exempel kan läsas direkt i QGIS-testerna uppströms som i test_authmanager_pki_ows eller test_authmanager_pki_postgres.
14.4. Anpassa plugins för att använda autentiseringsinfrastruktur
Många plugins från tredje part använder httplib2 eller andra Python-nätverksbibliotek för att hantera HTTP-anslutningar istället för att integrera med QgsNetworkAccessManager
och dess relaterade Authentication Infrastructure-integration.
För att underlätta denna integration har en Python-hjälpfunktion skapats som heter NetworkAccessManager
. Dess kod kan hittas här.
Denna hjälpklass kan användas som i följande snippet:
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. GUI för autentisering
I detta stycke listas de tillgängliga grafiska användargränssnitten som är användbara för att integrera autentiseringsinfrastruktur i anpassade gränssnitt.
14.5.1. GUI för att välja autentiseringsuppgifter
Om det är nödvändigt att välja en Authentication Configuration från den uppsättning som lagras i Authentication DB finns den tillgänglig i GUI-klassen QgsAuthConfigSelect
.

och kan användas på samma sätt som i följande utdrag:
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" )
Exemplet ovan är hämtat från QGIS-källan code. Den andra parametern i GUI-konstruktören hänvisar till typen av dataleverantör. Parametern används för att begränsa de kompatibla Authentication Method’s med den angivna leverantören.
14.5.2. GUI för autentiseringsredigerare
Hela det grafiska gränssnittet som används för att hantera autentiseringsuppgifter, auktoriteter och för åtkomst till autentiseringsverktyg hanteras av klassen QgsAuthEditorWidgets
.

och kan användas på samma sätt som i följande utdrag:
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()
Ett integrerat exempel finns i den relaterade test.