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

Authentication Database

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

Authentication Configuration

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:

  1. Basic Autentisering av användare och lösenord

  2. EsriToken ESRI tokenbaserad autentisering

  3. Identity-Cert Autentisering av identitetscertifikat

  4. OAuth2 OAuth2-autentisering

  5. PKI-Paths PKI-sökvägar autentisering

  6. PKI-PKCS#12 PKI PKCS#12 autentisering

14.3.2.2. Fylla i myndigheter

1authMgr = QgsApplication.authManager()
2# add authorities
3cacerts = QSslCertificate.fromPath( "/path/to/ca_chains.pem" )
4assert cacerts is not None
5# store CA
6authMgr.storeCertAuthorities(cacerts)
7# and rebuild CA caches
8authMgr.rebuildCaCertsCache()
9authMgr.rebuildTrustedCaCertsCache()

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.

../../_images/QgsAuthConfigSelect.png

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.

../../_images/QgsAuthEditorWidgets.png

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.

14.5.3. Behörighetsredigerare GUI

Ett GUI som används för att hantera endast behörigheter hanteras av klassen QgsAuthAuthoritiesEditor.

../../_images/QgsAuthAuthoritiesEditor.png

och kan användas på samma sätt som i följande utdrag:

1# create the instance of the QgsAuthAuthoritiesEditor GUI hierarchically
2#  linked to the widget referred with `parent`
3parent = QWidget()  # Your GUI parent widget
4gui = QgsAuthAuthoritiesEditor( parent )
5gui.show()